簡體   English   中英

為什么使用Apache + mod_wsgi對Flask應用程序進行gevent會引發NotImplementedError?

[英]Why gevent on a Flask app with Apache + mod_wsgi is raising NotImplementedError?

我在使用Apache(mod_wsgi)和gevent在共享主機(Webfaction)上部署我的Flask應用程序時遇到問題。

該應用程序在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-requests'異步模塊來發出並發HTTP請求。 我嘗試了谷歌,但我發現的唯一建議是打電話

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}

這個想法來自另一個答案 ,建議將WSGIApplicationGroup設置為GLOBAL以解決持續崩潰的WSGI進程的問題。 來自WSGI文檔

要強制特定的WSGI應用程序在初始化Python時創建的第一個Python子解釋器中運行,應使用WSGIApplicationGroup指令並將該組設置為'%{GLOBAL}'。

無法完全理解為什么這個指令解決了我的問題,但確實如此。 如果有人能夠用簡單的英語向我解釋這一點,我將非常高興;-)

嘗試用monkey.patch_all() monkey.patch_all(thread=False)替換monkey.patch_all() monkey.patch_all(thread=False) 如果它確實是在修補時導致問題的線程模塊,那么應該解決它。 request不使用線程。

我在https://serverfault.com/a/869625/355861上發布了以下答案

apache mod_wsgi目前不兼容gevent。 對於使用Apache的AWS彈性beanstalk,我對Flask使用了async_mode =“threading”,它運行良好。 注意,線程的性能低於gevent。 https://flask-socketio.readthedocs.io/en/latest/#deployment

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM