如何在芹菜工作者中一次仅执行一项任务,而又不丢失任务并保持队列中任务的顺序

时间:2018-06-27 17:57:07

标签: python redis celery

我希望某些任务一次只能运行一次。其他类型的任务可以在并发工作程序中运行。

我不能使用芹菜的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

我将不得不排在队列中,这样就不会发生竞争状况,但这是可行的(我认为)。

有没有更好/更简单的方法可以完成?也许我不需要维护队列并且可以直接使用芹菜的队列?

0 个答案:

没有答案