我有一个应用程序,每个用户都可以在其中创建任务,并且用户创建的每个任务都会添加到特定用户的动态队列中。因此,用户 1 中的所有任务都添加到User1_queue,用户 2 添加到User2_queue,依此类推。
我需要发生的是,当用户 1 将任务 1、任务 2 和任务 3 添加到他们的队列中时,执行任务 1,Celery 等到它完成后再执行任务 2,依此类推。
让它们从多个队列中并排执行是可以的,因此两个队列中的任务 1 和User2_queue的任务 1 都来自User1_queue。它只是限制 Celery 按照添加顺序在队列中同步执行任务。
是否可以让 Celery 每个队列的并发性为 1,以便任务不会在同一队列中并排执行?
如果它对访问此问题的任何人有所帮助,我通过设置多个并发为 1 的工作线程来解决我的问题,每个工作线程都在唯一的队列上。然后,我在 Django 应用程序中使用了一些逻辑来存储活动用户每个会话的队列名称。
接下来,我将添加额外的逻辑来选择"最不忙"的工作线程,并尝试将用户均匀分布在活动工作线程中。但就目前而言,它运行良好。
Flower是芹菜的监控工具,在试图解决这个问题时也提供了巨大的帮助。
您可以为每个工作人员选择一个队列-Q
选项来处理--concurrency=1
celery -A proj worker --concurrency=1 -n user1@%h -Q User1_queue
@JamesFoley 虽然以下内容可以在芹菜方面实现,但目前还不是(https://github.com/celery/celery/issues/1599 )
一些想法:
- 动态生成/控制芹菜工人
- 单数节拍任务,用于决定可以生成哪些任务以运行(锁定/互斥或数据库表监视任务)