4

当我将celery+gevent用于使用subprocess模块的任务时,我得到以下堆栈跟踪:

Traceback (most recent call last):
  File "/home/venv/admin/lib/python2.7/site-packages/celery/task/trace.py", line 228, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/venv/admin/lib/python2.7/site-packages/celery/task/trace.py", line 415, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/webapp/admin/webadmin/apps/loggingquarantine/tasks.py", line 107, in release_mail_task
    res = call_external_script(popen_obj.communicate)
  File "/home/webapp/admin/webadmin/apps/core/helpers.py", line 42, in call_external_script
    return func_to_call(*args, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 740, in communicate
    return self._communicate(input)
  File "/usr/lib64/python2.7/subprocess.py", line 1257, in _communicate
    stdout, stderr = self._communicate_with_poll(input)
  File "/usr/lib64/python2.7/subprocess.py", line 1287, in _communicate_with_poll
    poller = select.poll()
AttributeError: 'module' object has no attribute 'poll'

我的manage.py样子如下(在那里做猴子补丁):

#!/usr/bin/env python
from gevent import monkey
import sys
import os

if __name__ == "__main__":
    if not 'celery' in sys.argv:
        monkey.patch_all()
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webadmin.settings")
    from django.core.management import execute_from_command_line
    sys.path.append(".")
    execute_from_command_line(sys.argv)

芹菜任务表现得好像没有正确修补有什么原因吗?

ps 奇怪的是,当我在 Centos 下遇到此类异常时,我在 Macos 上的本地设置工作正常(所有软件包版本都相同,初始化和配置脚本也是如此)

4

1 回答 1

-1

gevent 中没有对 poll 的模拟,因此monkey.patch_all删除了 gevent.select 不模拟的轮询机制:poll、epoll、kqueue、kevent。请参阅gevent.monkey - 使标准库合作

于 2013-10-21T15:46:48.747 回答