【问题标题】:Celery tasks received but not executingCelery 任务已收到但未执行
【发布时间】:2017-05-28 22:10:00
【问题描述】:

我有收到但不会执行的 Celery 任务。我正在使用 Python 2.7 和 Celery 4.0.2。我的消息代理是 Amazon SQS。

这是celery worker的输出:

$ celery worker -A myapp.celeryapp --loglevel=INFO
[tasks]
  . myapp.tasks.trigger_build

[2017-01-12 23:34:25,206: INFO/MainProcess] Connected to sqs://13245:**@localhost//
[2017-01-12 23:34:25,391: INFO/MainProcess] celery@ip-111-11-11-11 ready.
[2017-01-12 23:34:27,700: INFO/MainProcess] Received task: myapp.tasks.trigger_build[b248771c-6dd5-469d-bc53-eaf63c4f6b60]

我尝试在运行celery worker 时添加-Ofair,但这并没有帮助。其他一些可能有用的信息:

  • Celery 总是接收 8 个任务,尽管有大约 100 条消息等待接收。
  • 大约每 4 或 5 次,一个任务实际上运行并完成,但随后又卡住了。
  • 这是ps aux 的结果。请注意,它在 3 个不同的进程中运行 celery(不知道为什么),其中一个进程的 CPU 利用率为 99.6%,即使它没有完成任何任务或任何事情。

进程:

$ ps aux | grep celery
nobody    7034 99.6  1.8 382688 74048 ?        R    05:22  18:19 python2.7 celery worker -A myapp.celeryapp --loglevel=INFO
nobody    7039  0.0  1.3 246672 55664 ?        S    05:22   0:00 python2.7 celery worker -A myapp.celeryapp --loglevel=INFO
nobody    7040  0.0  1.3 246672 55632 ?        S    05:22   0:00 python2.7 celery worker -A myapp.celeryapp --loglevel=INFO

设置:

CELERY_BROKER_URL = 'sqs://%s:%s@' % (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY.replace('/', '%2F'))
CELERY_BROKER_TRANSPORT = 'sqs'
CELERY_BROKER_TRANSPORT_OPTIONS = {
    'region': 'us-east-1',
    'visibility_timeout': 60 * 30,
    'polling_interval': 0.3,
    'queue_name_prefix': 'myapp-',
}
CELERY_BROKER_HEARTBEAT = 0
CELERY_BROKER_POOL_LIMIT = 1
CELERY_BROKER_CONNECTION_TIMEOUT = 10

CELERY_DEFAULT_QUEUE = 'myapp'
CELERY_QUEUES = (
    Queue('myapp', Exchange('default'), routing_key='default'),
)

CELERY_ALWAYS_EAGER = False
CELERY_ACKS_LATE = True
CELERY_TASK_PUBLISH_RETRY = True
CELERY_DISABLE_RATE_LIMITS = False

CELERY_IGNORE_RESULT = True
CELERY_SEND_TASK_ERROR_EMAILS = False
CELERY_TASK_RESULT_EXPIRES = 600

CELERY_RESULT_BACKEND = 'django-db'
CELERY_TIMEZONE = TIME_ZONE

CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['application/json']

CELERYD_PID_FILE = "/var/celery_%N.pid"
CELERYD_HIJACK_ROOT_LOGGER = False
CELERYD_PREFETCH_MULTIPLIER = 1
CELERYD_MAX_TASKS_PER_CHILD = 1000

报告:

$ celery report -A myapp.celeryapp

software -> celery:4.0.2 (latentcall) kombu:4.0.2 py:2.7.12
            billiard:3.5.0.2 sqs:N/A
platform -> system:Linux arch:64bit, ELF imp:CPython
loader   -> celery.loaders.app.AppLoader
settings -> transport:sqs results:django-db

【问题讨论】:

  • 模块名称匹配吗?

标签: python amazon-web-services amazon-ec2 celery amazon-elastic-beanstalk


【解决方案1】:

我也遇到了同样的问题。经过一番搜索后,我找到了将 --without-gossip --without-mingle --without-heartbeat -Ofair 添加到 Celery worker 命令行的解决方案。所以在你的情况下你的工人命令应该是 celery worker -A myapp.celeryapp --loglevel=INFO --without-gossip --without-mingle --without-heartbeat -Ofair

【讨论】:

  • 你能解释一下为什么吗?
  • @weaming 我解释了我的回答中(可能)发生了什么
  • 这对我不起作用。根据这个post,我在命令中添加了-P solo,例如:celery -A proj worker --loglevel=INFO --concurrency 1 -P solo
  • 工作就像一个魅力!非常感谢你,伙计!
  • solo 作为执行模式可以工作。但是,它不会并行执行作业,它是单线程的。请在生产模式下注意这一点。它只是忽略了那个并发选项..
【解决方案2】:

禁用工人八卦(--without-gossip)足以在 Celery 3.1 上为我解决这个问题。当启用CELERY_ACKS_LATE 时,似乎是一个错误导致此工作人员间通信挂起。确实收到了任务,但从未确认或执行。停止工作人员会将它们返回到队列中。

来自docs的八卦:

这意味着一个工人知道其他工人在做什么,并且可以 检测他们是否离线。目前这仅用于时钟 同步,但未来添加的可能性很多 并且您可以编写利用这一点的扩展。

因此,您很可能根本没有使用此功能,而且它还会增加您的代理的负载。

没有时间调查,但最好用最新的 Celery 进行测试,如果仍然存在,请打开一个问题。即使这种行为是预期的/不可避免的,也应该记录在案。

【讨论】:

    【解决方案3】:

    我也有同样的问题。毗湿奴的回答对我有用。可能还有另一种解决方案不需要将这些额外参数添加到 worker 命令中。

    我的问题是由于在任务代码中间导入其他模块引起的。当您启动工作程序时,celery 似乎会获取所有使用的模块,并且它只查看 .py 文件的开头。在运行期间,它不会引发任何错误并退出。在我将所有“import”和“from ... import ...”移动到代码文件的开头之后,它就可以工作了。

    【讨论】:

      【解决方案4】:

      首先安装 eventlet,

      
      > pip install eventlet
      
      

      然后运行

      celery -A myapp.celeryapp worker --loglevel=info -P eventlet

      【讨论】:

      • 请解释一下这是做什么的?
      【解决方案5】:

      我在 Windows 上遇到了类似的问题,我可以通过安装 eventlet 来解决它。

      pip install eventlet
      celery -A project_scope worker -l INFO -P eventlet
      

      【讨论】:

      • 一个现有的并且已经被赞成的答案有这个确切的解决方案。您的回答对此有何补充?
      猜你喜欢
      • 2020-10-12
      • 2021-08-30
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2016-12-09
      • 2012-02-13
      相关资源
      最近更新 更多