[英]Celery tasks on multiple machines
我有一台服務器,在其中安裝了RabbitMQ代理,並且兩個Celery使用者( main1.py和main2.py )都連接到同一代理。
在第一個使用者( main1.py )中,我實現了Celery Beat,它在特定隊列上多次發送不同的任務:
app = Celery('tasks', broker=..., backend=...)
app.conf.task_routes = (
[
('tasks.beat', {'queue': 'print-queue'}),
],
)
app.conf.beat_schedule = {
'beat-every-10-seconds': {
'task': 'tasks.beat',
'schedule': 10.0
},
}
@app.task(name='tasks.beat', bind=True)
def beat(self):
for i in range(10):
app.send_task("tasks.print", args=[i], queue="print-queue")
return None
在第二個使用者( main2.py )中,我實現了上述任務:
app = Celery('tasks', broker=..., backend=...)
app.conf.task_routes = (
[
('tasks.print', {'queue': 'print-queue'}),
],
)
@app.task(name='tasks.print', bind=True)
def print(self, name):
return name
當我啟動兩個芹菜工人時:
consumer1: celery worker -A main1 -Q print-queue --beat
consumer2: celery worker -A main2 -Q print-queue
我得到這些錯誤:
[ERROR/MainProcess] Received unregistered task of type 'tasks.print'
在第一個消費者
[ERROR/MainProcess] Received unregistered task of type 'tasks.beat'
在第二位消費者
是否可以在都連接到同一代理的不同Celery應用程序上拆分任務?
提前致謝!
這是正在發生的事情。 您有兩個工人A
和B
,其中一個恰好正在運行芹菜拍子(例如,一個是B
)。
task.beat
提交到隊列。 所有這些操作是在一條消息中放入包含某些元數據(包括任務名稱)的Rabbit消息。 兩名工人之一閱讀該消息。 A和B都在偵聽同一個隊列,因此任何一個都可以讀取它。
一種。 如果A讀取了消息,它將嘗試查找名為tasks.beat
的任務,因為A沒有定義該任務,所以將其炸毀了。
灣 如果B讀取了該消息,它將成功嘗試找到名為tasks.beat
的任務(因為它確實具有該任務)並將運行代碼。 tasks.beat
將在tasks.beat
一條新消息,其中包含tasks.print
的元數據。
tasks.print
但是任何一個都可能收到消息,因此將再次出現相同的問題。 實際上,芹菜可能正在做一些檢查以更早地拋出錯誤消息,但是我可以肯定這是潛在的問題。
簡而言之,隊列中的所有工作程序(包括節拍)都應運行相同的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.