Почему Gevent в приложении Flask с Apache + mod_wsgi вызывает NotImplementedError? - PullRequest
4 голосов
/ 14 марта 2012

У меня проблема с развертыванием моего приложения Flask с Apache (mod_wsgi) и gevent на общем хостинге (Webfaction).

Приложение отлично работает на сервере разработки, предоставленном Flask, но когда я пытаюсьчтобы развернуть его, я получаю следующую ошибку в лог-файле:

[Tue Mar 13 15:48:24 2012] [error] Traceback (most recent call last):
[Tue Mar 13 15:48:24 2012] [error]   File "evdns.pxi", line 78, in gevent.core.__evdns_callback (gevent/core.c:6300)
[Tue Mar 13 15:48:24 2012] [error]   File "/home/username/.virtualenvs/staging/lib/python2.7/site-packages/gevent/hub.py", line 297, in switch_args
[Tue Mar 13 15:48:24 2012] [error]   File "/home/username/.virtualenvs/staging/lib/python2.7/site-packages/gevent/hub.py", line 290, in switch
[Tue Mar 13 15:48:24 2012] [error]   File "/home/username/.virtualenvs/staging/lib/python2.7/site-packages/gevent/hub.py", line 135, in get_hub
[Tue Mar 13 15:48:24 2012] [error] NotImplementedError: gevent is only usable from a single thread

Мне нужен gevent, потому что я использую асинхронный модуль * python-запросы ' для одновременных HTTP-запросов.Я пытался найти Google, но единственный совет, который я нашел, это позвонить

from gevent import monkey
monkey.patch_all()

, что я уже делаю в своем коде.

Значение WSGIDaemonProcess равно:

WSGIDaemonProcess myapp processes=5 python-path=/home/myusername/webapps/myapp/lib/python2.7 threads=1

Вот мой httpd.conf: http://pastebin.com/eWygicJH

У кого-нибудь есть советы по решению этой проблемы?

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Кажется, я нашел решение сам. Следующая директива решила мою проблему:

WSGIApplicationGroup %{GLOBAL}

Идея исходит из другого ответа , где предлагается установить для WSGIApplicationGroup значение GLOBAL, чтобы решить проблему с процессом WSGI, который продолжает падать. Из документации WSGI :

Чтобы заставить конкретное приложение WSGI запускаться в самом первом Субинтерпретатор Python, созданный при инициализации Python, Директива WSGIApplicationGroup должна использоваться, и группа должна быть '% {GLOBAL}'.

Не могу полностью понять, почему эта директива решает мою проблему, но это так. Я буду более чем счастлив, если кто-то сможет объяснить мне это на простом английском языке; -)

1 голос
/ 14 марта 2012

Попробуйте заменить monkey.patch_all() на monkey.patch_all(thread=False). Если это действительно модуль потоков, который вызывает проблемы при исправлении, это должно решить это. request не использует многопоточность.

0 голосов
/ 21 августа 2017

Я разместил ответ ниже https://serverfault.com/a/869625/355861

apache mod_wsgi в настоящее время не совместим с gevent. Для эластичного beanstalk AWS с Apache я использовал async_mode = "threading" для Flask, и он работает хорошо. Обратите внимание, что потоки имеют меньшую производительность, чем Gevent. https://flask -socketio.readthedocs.io / ен / последний / # развертывания

app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="threading") 

Обратите внимание, что Flask может работать автономно с Gevent.

app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="gevent") 

if __name__ == '__main__':
    HOST = '127.0.0.1'
    PORT = 5055
    socketio.run(app, port=PORT, host=HOST)

Однако вам действительно нужен HTTP-сервер, например Gunicorn.

...