首页 文章

同步芹菜队列

提问于
浏览
0

我有一个应用程序,每个用户都可以创建任务,用户创建的每个任务都会添加到特定用户的动态队列中 . 因此,User1的所有任务都被添加到User1_queue,User2到User2_queue等 .

我需要做的是当User1将Task1,Task2和Task3添加到它们的队列中时,执行Task1并且Celery在执行Task2之前等待它完成,依此类推 .

让它们从多个队列中彼此并排执行是很好的,因此来自User1_queue的Task1和来自User2_queue的Task1 . 它只是限制Celery按照它们添加的顺序同步执行队列中的任务 .

是否有可能让Celery每个队列的并发性为1,这样任务就不会在同一个队列中彼此并行执行?


如果它可以帮助任何人访问这个问题,我通过设置多个并发度为1的工作者来解决我的问题,每个工作者都在一个唯一的队列中 . 然后我在我的Django应用程序中使用了一些逻辑来为活动用户存储每个会话的队列名称 .

在线下,我将添加额外的逻辑来选择“最不忙”的工作者,并尝试在活跃的工作者之间均匀地分布用户 . 但是现在它的工作非常完美 .

Flower,Celery的监控工具,在尝试解决这个问题时也是一个巨大的帮助 .

1 回答

  • 2

    您可以为每个要处理的工作人员选择一个队列 -Q option --concurrency=1

    celery -A proj worker --concurrency=1 -n user1@%h -Q User1_queue
    

    @JamesFoley虽然以下可以在芹菜方面实施,但现在不是(https://github.com/celery/celery/issues/1599

    一些想法:

    • 动态生成/控制芹菜 Worker

    • 奇异节拍任务,决定可以生成哪些任务运行(锁定/互斥或数据库表监视任务)

相关问题