Python 在多台机器上执行芹菜任务

Python 在多台机器上执行芹菜任务,python,rabbitmq,task,celery,celerybeat,Python,Rabbitmq,Task,Celery,Celerybeat,我有一个服务器,在那里我安装了一个RabbitMQ代理和两个芹菜消费者(main1.py和main2.py)都连接到同一个代理 在第一个使用者(main1.py)中,我实现了一个芹菜节拍,它在特定队列上多次发送不同的任务: app = Celery('tasks', broker=..., backend=...) app.conf.task_routes = ( [ ('tasks.beat', {'queue': 'print-queue'}), ], ) a

我有一个服务器,在那里我安装了一个RabbitMQ代理和两个芹菜消费者(main1.pymain2.py)都连接到同一个代理

在第一个使用者(main1.py)中,我实现了一个芹菜节拍,它在特定队列上多次发送不同的任务:

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
在第二个consumer(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'
论第二消费者

是否可以在连接到同一代理的不同芹菜应用程序上拆分任务


提前谢谢

下面是正在发生的事情。你有两个工人
A
B
,其中一个碰巧也在做芹菜生意(比如说一个是
B

  • 芹菜节拍将任务提交到队列中。所有这一切都是将一条消息和一些元数据(包括任务名称)放入兔子队列中
  • 两个工人中的一个读了这封信。A和B都在侦听同一个队列,因此任何一方都可以读取该队列

    a。如果A读取消息,它将尝试查找名为
    tasks.beat
    的任务,因为A没有定义该任务

    b。如果B读取消息,它将成功地尝试查找名为
    tasks.beat
    (因为它确实有该任务)的任务,并将运行代码<代码>任务。beat将在兔子中为包含
    任务元数据的新消息排队。打印

  • 同样的问题将再次出现,因为A和B中只有一个定义了
    任务。打印
    ,但其中一个可能会收到消息
  • 实际上,芹菜可能会做一些检查,以便更早地抛出错误消息,但我相当确定这是潜在的问题


    简而言之,队列中的所有工作人员(包括beat)都应该运行相同的代码。

    谢谢@mbattifarano,我完全理解你所说的。我使用两个不同的队列解决了这个问题,一个用于tasks.beat,另一个用于tasks.print。