【问题标题】:Celery inspect shows worker offline when Concurrency value reached达到并发值时,Celery 检查显示工作人员离线
【发布时间】:2014-09-25 04:21:39
【问题描述】:

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

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

这是我们在 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

kombu 版本: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

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

提前感谢您的帮助,

史蒂夫

【问题讨论】:

    标签: django rabbitmq celery


    【解决方案1】:

    我发现了一个解决方案,解决了这个问题。我改变了我的工人为通过提交-P threads参数来调用反对prefork的螺纹: P>

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

    我当时甚至能正确地检查人员时,他们在他们的并发值运行。我必须确保所有我的任务是线程安全的(shutil是主要罪犯,和一个简单的锁修好了)。 P>

    我希望这会有所帮助。

    史蒂夫 P>

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2021-12-24
      • 2019-10-16
      • 1970-01-01
      相关资源
      最近更新 更多