Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Cellery worker中一次只执行一个任务,而不丢失它并保持队列中任务的顺序_Python_Redis_Celery - Fatal编程技术网

Python 如何在Cellery worker中一次只执行一个任务,而不丢失它并保持队列中任务的顺序

Python 如何在Cellery worker中一次只执行一个任务,而不丢失它并保持队列中任务的顺序,python,redis,celery,Python,Redis,Celery,我希望某个任务一次只运行一个。其他类型的任务可以在并发工作进程中运行 我不能用芹菜,因为如果一个新任务已经在运行,我将失去它 我可以在一段时间后再次重试该任务,但如果同时出现一个新任务(第三个任务),并且第一个任务已经完成,那么它将运行(第二个任务仍在等待),这是我不想要的。我想维持秩序 我知道最简单的办法就是两个工人,两个排队。一个并发性大于1的工作进程监视其他任务的队列,另一个工作进程只有1个并发性,它一次只监视1个任务的队列。但我只想使用一个并发性大于1的worker 我有一种方法,将队列

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

我不能用芹菜,因为如果一个新任务已经在运行,我将失去它

我可以在一段时间后再次重试该任务,但如果同时出现一个新任务(第三个任务),并且第一个任务已经完成,那么它将运行(第二个任务仍在等待),这是我不想要的。我想维持秩序

我知道最简单的办法就是两个工人,两个排队。一个并发性大于1的工作进程监视其他任务的队列,另一个工作进程只有1个并发性,它一次只监视
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
我必须锁定队列,这样比赛条件就不会发生,但这是可行的(我认为)

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