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
Concurrency 由两个工作进程使用芹菜同时运行的唯一任务_Concurrency_Redis_Celery - Fatal编程技术网

Concurrency 由两个工作进程使用芹菜同时运行的唯一任务

Concurrency 由两个工作进程使用芹菜同时运行的唯一任务,concurrency,redis,celery,Concurrency,Redis,Celery,我正在做一个项目,目标是运行一个守护进程,将任务发送到芹菜队列,Redis被用作代理。每个任务必须一次处理一次(不允许并发) 为了执行此操作,我在我的守护进程中实现了以下代码,该守护进程充当Redis的锁: while True: for foo in bar: if not self.redis_client.exists(foo.name): # Send the task to the Celery queue t

我正在做一个项目,目标是运行一个守护进程,将任务发送到芹菜队列,Redis被用作代理。每个任务必须一次处理一次(不允许并发)

为了执行此操作,我在我的守护进程中实现了以下代码,该守护进程充当Redis的锁:

while True:    
    for foo in bar:
        if not self.redis_client.exists(foo.name):
           # Send the task to the Celery queue
           task = celery_app.send_task('buzz', context={'name': foo.name})
           redis_client.send(foo.name, task.id)
    time.sleep(10)
一旦任务完成或失败,锁将由任务本身释放

出于某些我不理解的原因,任务有时由两个工作进程同时运行:

[2018-04-11 15:23:45,705: INFO/ForkPoolWorker-1] Task has been executed in 101.43s for foo
[2018-04-11 15:23:45,881: INFO/ForkPoolWorker-4] Task has been executed in  114.66s for foo
这种情况并不经常发生,但我根本不希望它发生。如何解释这种行为?这可能与Redis写入键/值对的开销时间有关吗


作为补充信息,我还有一个Flower实例在同一台服务器上运行。

这里缺少很多详细信息,但我会尽力提供帮助: 由于您的需求-没有并发性-我猜您只有一个芹菜工人在运行。 运行此辅助进程时,可以通过
-c
标志(或
-并发
)指定并发级别。请确保将其设置为1,以便该辅助进程一次只存在一个实例。参考号

例如:
芹菜-A项目工作者--loglevel=INFO--concurrency=1-n工作者1@%h

另一件您应该注意的事情是
worker\u prefetch\u乘数
,默认情况下,它一次预取4条消息。您可能还想将其更改为1(我猜您没有描述完整的场景)。参考号

最后一件事,关于您的ReRIS锁,考虑使用SENTX(SET,如果不存在)-更多信息-< /P>


祝你好运

谢谢你的提示!关于我目前使用的东西,您猜对了(我对构建基于芹菜的体系结构是新手)。我将尝试您的所有建议,并查看SETNX是否已在redis py中实现。@DrMouse NP,如果它解决了您的问题,请不要忘记接受答案;-)