我使用eventlet运行我的Django-celery任务。但有些事情仍然存在阻碍。我使用了eventlet的阻塞检测,发现getaddrinfo()是阻塞的。我在某处读到了我必须安装“dnspython”软件包,但无论是否有所不同。它安装在当下:
dnspython - A DNS toolkit for Python
INSTALLED: 1.11.0 (latest)
阻塞出现在eventlet的代码(eventlet.green.socket)中也很有趣。
我像那样经营芹菜:
/var/www/myproject/async_manage.py celeryd -B \
--schedule=/var/www/myproject/celerybeat-schedule \
--loglevel=INFO -P eventlet -c 1000 \
--settings=myproject.settings.myproject_deployment
我的自定义async_manage.py(部分内容):
import pymysql
pymysql.install_as_MySQLdb()
import eventlet
import eventlet.debug
os.environ["EVENTLET_NOPATCH"] = 'True'
eventlet.monkey_patch()
eventlet.debug.hub_prevent_multiple_readers(False)
eventlet.debug.hub_blocking_detection(True, 0.1)
if __name__ == "__main__":
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
这是我得到的错误:
Task myproject.apps.myapp.tasks.mytask with id f8794028-699e-43ba-b48f-3d81b7614f1f raised exception:
'RuntimeError("Blocking detector ALARMED atTraceback(filename=\'/var/www/virtualenvs/myproject/local/lib/python2.7/site-packages/eventlet/green/socket.py\', lineno=43, function=\'create_connection\', code_context=[\' for res in getaddrinfo(host, port, 0, SOCK_STREAM):\\\\n\'], index=0)",)'
你有什么线索如何解决这个问题?这对我来说毫无意义。
提前致谢, 的Matthias
答案 0 :(得分:0)
您可以从删除os.environ["EVENTLET_NOPATCH"] = 'True'
开始
因为它有误导性。它没有做任何事情。 Eventlet从不支持此环境变量。
然后,尝试执行此代码:
from eventlet.green import socket
print(socket.getaddrinfo.__module__)