芹菜排队挂



我有一份特定的工作,似乎每隔一段时间就会吊死我的芹菜工人。我正在使用 rabbitmq 作为经纪人。我已经尝试了几件事来解决这个问题,但无济于事:

  • 自动缩放工作线程,以允许挂起的工作线程有足够的时间完成执行
  • 设置全局超时

所以我对导致这个问题的原因以及如何解决它有点不足。谁能给我任何指示?有问题的任务只是将一条记录插入数据库(在本例中为MongoDB)。

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

使子进程挂起的特定作业通常是永远不会完成的 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)

您很可能在 Celery/Kombu 中遇到了一个无限循环错误(见 https://github.com/celery/celery/issues/3712),该错误最近才得到修复。它还没有进入发布阶段。有关详细信息,请参阅提交 https://github.com/celery/kombu/pull/760。如果无法将存储库版本用于安装,解决方法是切换到 Redis 或暂时设置CELERY_WORKER_PREFETCH_MULTIPLIER=0-P solo

相关内容

  • 没有找到相关文章

最新更新