我正在使用芹菜来运行长时间运行的任务(每个任务~20分钟)。每当用户提交请求时,我都会为该用户安排 ~10 个芹菜任务。因此,来自用户的单个请求需要 200 分钟才能完成。当其他用户提交请求时,会出现此问题。第二个用户的任务会等到第一个用户发出的所有任务完成。我的问题是,有没有办法在这两个用户之间交替。
当前场景:用户 A(10 个任务),用户 B(10 个任务)。
执行顺序:A,A,A,A,A,A,A,B,
所需序列:
A,B,A,B,A,A,B,B,A,A,B,B,A,B,A我像这样运行我的任务。
run_task.delay(user_id_here)
此外,上述方案不限于两个用户。为了简单起见,我一直保持这种方式。另外,由于内存限制,我只能生成一个芹菜工人。因此,为每个用户生成一个动态工作线程是行不通的。
谢谢。
一种可能的解决方案是使用不同的队列将用户任务(随机)路由到单独的芹菜工人身上。这可能不会给你完全相同的预期行为,但它会减少任务等待时间。
在终端中:
$ celery -A my_app worker -l info -c 1 -n my_worker1 -Q queue1
$ celery -A my_app worker -l info -c 1 -n my_worker2 -Q queue2
$ celery -A my_app worker -l info -c 1 -n my_worker3 -Q queue3
在您的 tasks.py:
selected_queue = select_queue() # select_queue is function that you may implement yourself to change each time between the queues
my_task.apply_async(args=my_args, queue=selected_queue)