芹菜队列挂

时间:2012-09-16 12:47:25

标签: rabbitmq celery

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

  • 自动调整工作人员以允许挂起的工作人员有足够的时间来完成执行
  • 设置全局超时

所以我对导致这个问题的原因以及如何解决这个问题进行了简短介绍。任何人都可以给我任何指示吗?有问题的任务就是将记录插入数据库(在本例中为MongoDB)。

更新:我添加了CELERYD_FORCE_EXECV。我们会看看是否可以修复它。 更新2:不!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

你最有可能在Celery / Kombu(见https://github.com/celery/celery/issues/3712)中遇到一个无限循环错误,它最近才得到修复。它还没有发布。有关详细信息,请参阅提交https://github.com/celery/kombu/pull/760。如果您无法使用repo版本进行安装,那么解决方法是切换到Redis或立即设置CELERY_WORKER_PREFETCH_MULTIPLIER=0-P solo