我希望某些任务一次只能运行一次。其他类型的任务可以在并发工作程序中运行。
我不能使用芹菜的example,因为如果一个新任务已经在运行,我将失去它。
我可以在一段时间后重试该任务,但是如果同时有一个新任务(第三个任务)出现,并且如果第一个任务已经完成,则它将运行(第二个任务仍在等待中),我不这样做不想。我要保留订单。
我知道最简单的事情是要有两个工人和两个队列。并发性大于1的一名工作人员监视其他任务的队列,而并发性只有1的一名工作人员将仅监视one_at_a_time
类型任务的队列。但是我只想使用一个并发> 1的工作器。
我有一种方法是将队列直接存储在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
我将不得不排在队列中,这样就不会发生竞争状况,但这是可行的(我认为)。
有没有更好/更简单的方法可以完成?也许我不需要维护队列并且可以直接使用芹菜的队列?