Почему gevent в приложении Flask с Apache + mod_wsgi вызывает NotImplementedError?
Вопрос
У меня возникла проблема с развертыванием моего приложения 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
У кого-нибудь есть какие-нибудь советы по решению этой проблемы?
Решение
Похоже, я нашел решение сам.Следующая директива решила мою проблему:
WSGIApplicationGroup %{GLOBAL}
.
Идея исходит из другого Ответ Где предлагается установить WSGIAPPLINGGROUP Global для решения проблемы с процессом WSGIЭто продолжается разбиться. Из документации WSGI :
Чтобы заставить определенное приложение WSGI для прогона в самом первом Python Sub переводчик, созданный, когда Python инициализирован, Следует использовать директиву WSGIAPlicationGroup, и группа, установленная на '% {Global}'.
не может полностью понять, почему эта директива решает мою проблему, но это делает.Я буду более чем счастлив, если кто-то может объяснить это мне в простом английском языке; -)
Другие советы
Попробуйте заменить monkey.patch_all()
с monkey.patch_all(thread=False)
.Если это действительно модуль потоковой передачи, который вызывает проблему при исправлении, это должно решить ее. request
не использует многопоточность.
Я опубликовал ниже ответа на https://serverfault.com/a/869625/355861
apache mod_wsgi в настоящее время не совместим с Gevent.Для AWS Elestic Beanstalk с Apache я использовал async_mode="Threading" для Flask и работает хорошо.Примечание, резьба имеет меньше производительности, чем Gevent. https://flask-socketio.readtheDoc.io/en/latest/#Deplobement/ a>
app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="threading")
.
Обратите внимание, что колба может запустить автономный с помощью 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.