1

我有一项特定的工作,似乎时常让我的芹菜工人绞死。我正在使用rabbitmq 作为经纪人。我尝试了几件事来解决这个问题,但无济于事:

  • 自动缩放工作人员以让挂起的工作人员有足够的时间完成执行
  • 设置全局超时

因此,我对导致此问题的原因以及如何解决此问题提出了一些建议。任何人都可以给我任何指示吗?有问题的任务只是将一条记录插入数据库(在本例中为 MongoDB。)

更新:我添加了CELERYD_FORCE_EXECV。我们会看看这是否能解决它。更新 2:不!

4

2 回答 2

1

使子进程挂起的特定作业通常是 IO 永远不会完成的症状,例如 Web 请求或没有超时的套接字读取。

大多数库支持设置超时,但如果不是,您可以随时使用socket.setdefaulttimeout

import socket

@task
def http_get(url, timeout=1.0, retry_after=3.0, max_retries=None):
    prev_timeout = socket.getdefaulttimeout()
    socket.setdefaulttimeout(timeout)
    try:
        return requests.get(url)
    except socket.timeout:
        raise http_get.retry(exc=exc, countdown=retry_after, max_retries=max_retries)
    finally:
        socket.setdefaulttimeout(prev_timeout)
于 2012-09-16T20:59:03.650 回答
1

您很可能在 Celery / Kombu 中遇到了一个无限循环错误(请参阅https://github.com/celery/celery/issues/3712),该错误最近才得到修复。它还没有发布。有关详细信息,请参阅提交https://github.com/celery/kombu/pull/760。如果您不能为您的安装使用 repo 构建,则解决方法是切换到 Redis 或 set CELERY_WORKER_PREFETCH_MULTIPLIER=0and -P solofor now。

于 2017-07-17T07:55:12.857 回答