Concurrency 由两个工作进程使用芹菜同时运行的唯一任务
我正在做一个项目,目标是运行一个守护进程,将任务发送到芹菜队列,Redis被用作代理。每个任务必须一次处理一次(不允许并发) 为了执行此操作,我在我的守护进程中实现了以下代码,该守护进程充当Redis的锁: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
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,如果它解决了您的问题,请不要忘记接受答案;-)