确保Celery中来自不同来源的任务顺序

时间:2015-02-21 19:14:30

标签: python multithreading rabbitmq celery

可能会问你一个关于芹菜的问题吗?

我有不同的作家每X分钟写一个任务。每个任务都需要完成同一个编写器的任务。该系统运行良好,如X分钟>>几秒钟完成任务。

但是,现在,作者可能会在同一时间发送两到三个任务。显然,Celery + RabbitMQ会将这项任务分配给不同的工作人员,造成麻烦。

我已经搜索过,但是我找到了关于阻止一个工人直到另一个人完成阻止的响应(例如使用Redis),但这是不可能的,因为我的工作人员少于作家。

我需要N个队列的N队列,Celery能够理解每个队列中的顺序。我会有成千上万的作家,所以我不能创造这么多的工人。

实施例: A B C编写者,A1,A2 ......任务,只有一个工作人员

我收到了#34;同样的#34;时间 A1,A2,B1,C1,B2,C2,A3,B3,C3

Celery应该创建队列 A(1-2-3) B(1-2-3) C(1-2-3)

然后发送任务A1,然后,下一个,如果是A2,B1,C1则不重要,但它不应该是A3,B2,B3,C2,C3。

希望我解释清楚

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为你需要为每个队列创建一个worker来强制执行这样的排序。否则,工作人员将只使用先进先出的方法来处理任务。您可以根据需要创建任意数量的队列,并配置每个工作程序从哪些队列接收消息。您可以在启动工作程序时传递-Q参数以设置其队列,如Workers Guide中所述。

celery -A my_project worker -l info -Q A

然后,您可以使用Routing Guide设置全局映射,以定义每个任务进入哪些队列。

CELERY_ROUTES = {
    'my_app.tasks.task_a1': {'queue': 'A'},
    'my_app.tasks.task_a2': {'queue': 'A'},
    'my_app.tasks.task_b1': {'queue': 'B'},
    'my_app.tasks.task_c1': {'queue': 'C'},
}

或者,您可以根据Calling Tasks Guide在提交每个任务实例时指定队列。

task_a1.apply_async(queue='A')