gpt4 book ai didi

python - celery worker 没有填满并发槽

转载 作者:行者123 更新时间:2023-11-28 16:36:42 25 4
gpt4 key购买 nike

我有一个并发为 4 的工作人员。我看到 4 个进程在 flower 中启动,一切看起来都很好。

如果我在 shell 中执行此操作,那么我会看到 4 个工作人员执行任务,其余的被保留,它一次处理 4 个,直到队列为空。

[my_task.apply_async() for i in xrange(10)]

但是,如果我逐行执行此操作,则只有前两个任务会得到积极处理,从那时起它一次只处理两个任务。

my_task.apply_async()
my_task.apply_async()
my_task.apply_async()
my_task.apply_async()
...

有什么想法吗?

最佳答案

通常这是因为子进程填满了并发槽。 Celery 默认使用 prefork 作为执行池,每次生成任务的子进程(另一个 fork)时,它都被视为一个正在运行的进程来填充并发槽。

避免这种情况的最简单方法是 using eventlet ,这将允许您在每个任务上产生多个异步调用。但是,这要求您的任务都没有阻塞调用,例如 subprocess.communicate,因为它们会阻塞所有任务。

否则,如果您有必要的阻塞调用,并且您知道您的任务一次只会有一个运行的子进程,您可以将 CELERYD_CONCURRENCY 设置为双倍(8) 并为您的任务设置开始时间限制,因此 8 个任务不会立即开始(例如使用 @app.task(rate_limit='10/m'))。但是,这有点 hack,使用 eventlet 肯定是首选。

关于python - celery worker 没有填满并发槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25187994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com