【问题标题】:Lots of socket errors with celery eventlet taskscelery eventlet 任务的许多套接字错误
【发布时间】:2011-09-18 21:23:40
【问题描述】:

在使用 --pool=eventlet 选项运行我的 celery worker 时,我从 amqplib.client_0_8.method_framing.read_method 收到很多“IOError: Socket closed”异常。我还看到来自 eventlet.hubs.hub.switch 的很多超时异常。

我正在使用类似于https://gist.github.com/821848 的 async_manage.py 脚本,运行如下:

./async_manage.py celeryd_detach -E --pool=eventlet --concurrency=120 --logfile=<path>

这是一个已知问题,还是我的配置或设置有问题?

我正在运行 djcelery 2.2.4、Django 1.3 和 eventlet 0.9.15。

【问题讨论】:

  • 你确定你的任务不会阻塞调用吗?
  • 我正在修补每一个,但我不能 100% 确定没有任何东西阻塞。找出答案的最佳方法是什么?如果是,我该怎么办?
  • monkey 修补只修补 eventlet 知道如何修补的内容,因此您仍然可以使用未涵盖的库。例如,请参见此处:unethicalblogger.com/2010/08/28/…
  • 我启用了阻塞检测,它偶尔会在 django/db/backends/__init__.py 中的“return self.connection.commit()”处阻塞 - 我正在使用 MySQL。有什么办法可以避免吗?
  • 发现了未记录的 MySQLdb 选项到 monkey_patch - 现在做更多测试!

标签: django celery django-celery eventlet


【解决方案1】:

问题是某些代码阻塞的副作用。我设法使用in this article 描述的 eventlet 选项检测到阻塞代码。

有 2 个地方发生了阻塞:DNS 查找和 MySQL 数据库访问。我设法通过安装 dnspython 包解决了第一个问题,第二个我在 eventlet 中使用了未记录的 MySQLdb 选项:

import eventlet
eventlet.monkey_patch()
eventlet.monkey_patch(MySQLdb=True)

【讨论】:

    猜你喜欢
    • 2018-06-25
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2018-02-10
    • 2018-08-03
    • 2011-09-15
    • 2014-11-03
    相关资源
    最近更新 更多