Python 如何在Cellery worker中一次只执行一个任务,而不丢失它并保持队列中任务的顺序
我希望某个任务一次只运行一个。其他类型的任务可以在并发工作进程中运行 我不能用芹菜,因为如果一个新任务已经在运行,我将失去它 我可以在一段时间后再次重试该任务,但如果同时出现一个新任务(第三个任务),并且第一个任务已经完成,那么它将运行(第二个任务仍在等待),这是我不想要的。我想维持秩序 我知道最简单的办法就是两个工人,两个排队。一个并发性大于1的工作进程监视其他任务的队列,另一个工作进程只有1个并发性,它一次只监视Python 如何在Cellery worker中一次只执行一个任务,而不丢失它并保持队列中任务的顺序,python,redis,celery,Python,Redis,Celery,我希望某个任务一次只运行一个。其他类型的任务可以在并发工作进程中运行 我不能用芹菜,因为如果一个新任务已经在运行,我将失去它 我可以在一段时间后再次重试该任务,但如果同时出现一个新任务(第三个任务),并且第一个任务已经完成,那么它将运行(第二个任务仍在等待),这是我不想要的。我想维持秩序 我知道最简单的办法就是两个工人,两个排队。一个并发性大于1的工作进程监视其他任务的队列,另一个工作进程只有1个并发性,它一次只监视1个任务的队列。但我只想使用一个并发性大于1的worker 我有一种方法,将队列
1个任务的队列。但我只想使用一个并发性大于1的worker
我有一种方法,将队列直接存储在redis
:
@app.task()
def one_at_a_time_task(arg):
if redis.queue.length == 0:
redis.queue.add(arg)
call_my_task()
else:
redis.queue.add(arg)
def call_my_task():
while(redis.queue.length > 0):
taskArgs = redis.queue.first
# actual task logic ...
redis.queue.dequeue
我必须锁定队列,这样比赛条件就不会发生,但这是可行的(我认为)
有没有更好/更简单的方法?也许我不需要维护队列,可以直接使用芹菜队列