gpt4 book ai didi

django - 当达到并发值时,Celery inspect 显示 worker 离线

转载 作者:行者123 更新时间:2023-12-01 23:54:02 28 4
gpt4 key购买 nike

我们的项目使用 Django 运行网络服务器,Celery/RabbitMQ 向工作人员分配任务。每当一个工作人员有能力完成任务时(例如,四个并发有四个任务),他们就会停止从花或内置的 celery 检查中出现。

ETA:worker 仍然在线,当任务完成使得 worker 低于并发值时,它再次出现在 flower 和 inspect 中。不幸的是,我正在尝试使用检查的“保留”方法来查看排队的任务,但只要我能看到工作人员,它总是空的。

这是我们在 Django 设置文件中的 Celery 设置:

BROKER_URL = 'amqp://[user]:[pw]@[host]//'

CELERY_ACCEPT_CONTENT = ['json']
CELERY_EVENT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'amqp'
CELERY_TIMEZONE = 'US/Mountain'
CELERY_RESULT_PERSISTENT = True
CELERY_TASK_RESULT_EXPIRES = 3600 # seconds
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_DEFAULT_QUEUE = 'tasks'
CELERY_TRACK_STARTED = True

from kombu import Queue

CELERY_QUEUES = (Queue('tasks', routing_key='task.#'),
Queue('frontend_tasks', routing_key='frontend.#'),
)

CELERY_DEFAULT_ROUTING_KEY = 'task.default'
CELERY_DEFAULT_EXCHANGE = 'tasks'

celery 版本:3.1.13

RabbitMQ 版本:3.3.4-1

海带版本:3.0.21

amqp 版本:1.4.5

Celery worker 的调用:

python manage.py celery worker -f c:\logs\celery.log -E -l info --settings=[proj].settings.production

更新:将 prefetch multiplier 设置为 1 后,即使他们有四个任务,我仍然可以看到 worker。但是,我看不到工作人员的任何待处理任务,因为它们尚未从服务器中获取。有谁知道是否有办法让工作人员(出现)在线并仍然看到队列中的待处理任务?将 prefetch multiplier 设置为 2 会使工作人员在有四个或更多任务时从我的 inspect/flower 中退出。即使将预取乘数设置为 2 并将并发设置为 1 或 2(从 4 降低)也会导致相同的“消失的工作人员”问题。

在此先感谢您的帮助,

史蒂夫

最佳答案

我找到了解决此问题的解决方案。我通过将 -P threads 参数提交给调用,将我的工作人员更改为线程化而不是 prefork:

python manage.py celery worker -f c:\logs\celery.log -E -P threads -l info --settings=[proj].settings.production

然后我能够正确地检查工作人员,即使他们以并发值运行。我确实必须确保我的所有任务都是线程安全的(shutil 是主要问题,一个简单的锁修复了它)。

希望对您有所帮助。

史蒂夫

关于django - 当达到并发值时,Celery inspect 显示 worker 离线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089116/

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