Apache + mod_wsgi가 포함된 Flask 앱의 gevent가 NotImplementedError를 발생시키는 이유는 무엇입니까?
문제
Apache(mod_wsgi)를 사용하여 Flask 앱을 배포하는 데 문제가 있습니다. 공유 호스팅 (Webfaction)의 gevent.
응용 프로그램은 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를 사용하고 있기 때문에 gevent가 필요합니다. python-requests의 비동기 모듈 받는 사람 동시 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}
.
아이디어는 다른 답변 wsgipplicationgroup을 전역으로 설정하여 WSGI 프로세스의 문제를 해결할 수 있도록 제안됩니다.계속해서 충돌합니다. WSGI 문서에서 :
특정 WSGI 응용 프로그램을 매우 먼저 실행하도록 강제합니다. 파이썬이 초기화되면 생성 된 Python 하위 인터프리터가 생성됩니다. WSGiaPlicationGroup 지시문을 사용해야하며 그룹이 '% {전역}'.
이 지시문이 왜 문제를 해결하는 이유를 완전히 이해할 수는 없습니다.누군가가 평범한 영어로 이것을 설명 할 수 있다면 나는 행복 할 것입니다. -)
다른 팁
교체해 보세요 monkey.patch_all()
~와 함께 monkey.patch_all(thread=False)
.패치 시 문제를 일으키는 것이 실제로 스레딩 모듈이라면 이 방법으로 문제가 해결될 것입니다. request
스레딩을 사용하지 않습니다.
https://serverfault.com/a/869625/355861
Apache mod_wsgi는 현재 gevent와 호환되지 않습니다.Apache가있는 AWS Elastic Beanstalk의 경우 플라스크 용 Async_mode="threading"을 사용했습니다.참고, 스레딩은 GEVENT보다 성능이 적습니다. https://flask-socketio.readthedocs.io/en/latest/#deployment <./ 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)
.