【问题标题】:Celery conf in pythonpython中的芹菜conf
【发布时间】:2020-05-20 19:40:17
【问题描述】:

我尝试了很多东西,搜索了很多问题,但我的问题仍未解决。

我正在使用 docker-composepython celeryrabbitmq,而没有任何其他烧瓶或 django 框架。

我尝试了很多东西来配置 celery 工作池,我发现只有一个功能可以工作,但我无法使用 gui 实例运行它,并且在 celery 图像中使用它不起作用, app.control.grow_pool

我不是用 celery 命令启动 celery,而是用 python 文件。 https://docs.celeryproject.org/en/stable/userguide/configuration.html?highlight=autoscaler

# my_celery_app.py
from __future__ import absolute_import, unicode_literals
from celery.concurrency.prefork import TaskPool
from celery.worker.autoscale import Autoscaler
from celery import Celery

from analyzer.database_operator import get_db_all_tweet_list

import time
import os

user = os.getenv('LOGIN', 'admin')
password = os.getenv('PASSWORD', 'mypass')
hostname = os.getenv('HOSTNAME', 'localhost')

broker_url = f'amqp://{user}:{password}@{hostname}:5672/'
app = Celery('tasks', broker=broker_url, namespace="CELERY")


# app.conf.worker_pool = TaskPool
# app.control.worker_max_tasks_per_child = 10
# app.conf.worker_autoscaler = Autoscaler(None, min_concurrency=3, max_concurrency=10)


@app.task
def show(*args, **kwargs):
    duration = 10
    print(f"Start, args: {args}, kwargs: {kwargs}")
    for x in range(duration):
        # print(duration - x)
        time.sleep(0.3)

    # print("Bye celery")


get_db_all_tweet_list = app.task(get_db_all_tweet_list)

if __name__ == "__main__":
    app.worker_main()

另一个不起作用的解决方案,但它引发错误

# learning_celery.py

from celery.app.control import Control

controller = Control(app)
controller.autoscale(10, 4)
worker_1        | [2020-05-20 19:32:08,311: ERROR/MainProcess] pidbox command error: ValueError('Autoscale not enabled')
worker_1        | Traceback (most recent call last):
worker_1        |   File "/usr/local/lib/python3.8/site-packages/kombu/pidbox.py", line 104, in dispatch
worker_1        |     reply = handle(method, arguments)
worker_1        |   File "/usr/local/lib/python3.8/site-packages/kombu/pidbox.py", line 126, in handle_cast
worker_1        |     return self.handle(method, arguments)
worker_1        |   File "/usr/local/lib/python3.8/site-packages/kombu/pidbox.py", line 120, in handle
worker_1        |     return self.handlers[method](self.state, **arguments)
worker_1        |   File "/usr/local/lib/python3.8/site-packages/celery/worker/control.py", line 513, in autoscale
worker_1        |     raise ValueError('Autoscale not enabled')
worker_1        | ValueError: Autoscale not enabled

【问题讨论】:

  • 解决问题的最快方法是读取 CLI 处理程序的源代码以获取 Celery worker 的 --autoscale 参数。如果我有时间我会检查它...

标签: python celery


【解决方案1】:

我想如果你想自己运行worker而不是使用提供的CLI工具,使用app.worker_main(),那么你需要在argv列表中提供参数。由于您主要关心自动缩放(据我所知已弃用 - 可惜,这是一个很好的功能),因此 argv 至少应该是 ["--autoscale", "10,3"]

所以尝试用app.worker_main(argv=["--autoscale", "10,3"]) 替换app.worker_main() 行,看看是否有效...如果无效,请尝试使用argv=["--autoscale=10,3"]

【讨论】:

  • 我在 compose 中修复了其他服务,我现在应该重构项目以使用 celery -A app worker 启动 celery 吗?
  • 另外,第二个选项让我开始,但没有任何改变
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2021-10-24
  • 2016-02-13
  • 1970-01-01
相关资源
最近更新 更多