簡體   English   中英

多台機器上的芹菜任務

[英]Celery tasks on multiple machines

我有一台服務器,在其中安裝了RabbitMQ代理,並且兩個Celery使用者( main1.pymain2.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應用程序上拆分任務?

提前致謝!

這是正在發生的事情。 您有兩個工人AB ,其中一個恰好正在運行芹菜拍子(例如,一個是B )。

  1. celery beat將task.beat提交到隊列。 所有這些操作是在一條消息中放入包含某些元數據(包括任務名稱)的Rabbit消息。
  2. 兩名工人之一閱讀該消息。 A和B都在偵聽同一個隊列,因此任何一個都可以讀取它。

    一種。 如果A讀取了消息,它將嘗試查找名為tasks.beat的任務,因為A沒有定義該任務,所以將其炸毀了。

    如果B讀取了該消息,它將成功嘗試找到名為tasks.beat的任務(因為它確實具有該任務)並將運行代碼。 tasks.beat將在tasks.beat一條新消息,其中包含tasks.print的元數據。

  3. 因為只有A和B中的一個定義了tasks.print但是任何一個都可能收到消息,因此將再次出現相同的問題。

實際上,芹菜可能正在做一些檢查以更早地拋出錯誤消息,但是我可以肯定這是潛在的問題。

簡而言之,隊列中的所有工作程序(包括節拍)都應運行相同的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM