2012-03-13 58 views
4

我在使用Apache(mod_wsgi) 和gevent共享主機(Webfaction)部署我的Flask應用程序時遇到問題。爲什麼gevent在Apache + mod_wsgi的Flask應用程序中引發NotImplementedError?

應用程序工作在由瓶提供的開發服務器,但是當我 嘗試部署它,我得到的日誌文件中出現以下錯誤:因爲我使用了python-requests' async module

[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到 發出併發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

任何人有任何建議來解決這個問題?

+0

這是你的httpd.conf中WSGIDaemonProcess的值嗎? – Masci 2012-03-13 21:50:07

+1

可能是因爲根據我的經驗gevent有點不高興,如果只有在其他人已經導入並以某種方式使用它時猴子纔會修補Python線程模塊。正在導致我無法解決某些問題。儘管如此,還沒有機會深入研究問題。 – 2012-03-13 23:47:17

+0

@Masci我更新了一個鏈接到我的httpd.conf和WSGIDaemonProcess的值 – raben 2012-03-14 14:08:40

回答

2

似乎我自己找到了解決方案。下面的指令來解決我的問題:

WSGIApplicationGroup %{GLOBAL} 

思想來自另一answer在那裏建議WSGIApplicationGroup設置爲GLOBAL解決與一個WSGI的過程,保持崩潰的問題。 From WSGI documentation

要強制特定WSGI應用中時的Python被初始化時, WSGIApplicationGroup指令應使用的組設置爲 「%{GLOBAL}」創建第 的Python子解釋器內運行的。

不能完全理解爲什麼這個指令解決了我的問題,但它確實如此。我會很樂意,如果有人能夠用簡單的英語向;-)給我講解一下

+0

請參見[爲什麼是方法,使用gevent-in-a-mod-wsgi-deployed-flask-api-raising-error](http://serverfault.com/questions/754841/why-is -method-that-uses-gevent-in-a-mod-wsgi-deployed-flask-api-raising-error-ab)......很遺憾,如此遲到的遊戲,但我終於有了答案。 – 2016-08-18 18:22:57

+0

爲什麼-1這個? 「無法完全理解爲什麼這個指令能解決我的問題,但它確實如此」的問題的相關答案是「我在這裏找到了答案:爲什麼指令WSGIApplicationGroup%{GLOBAL}可用於創建新線程 簡而言之: WSGIApplicationGroup:設置執行相同的Python解釋器下運行(首先創建的) 所以,在默認情況下,每一個新的線程一定是沒有使用相同的Python解釋器實例 對於uWSGI,等效方法是將其添加到.ini文件中: single-interpreter = true「 – 2016-09-26 18:08:57

1

嘗試用monkey.patch_all(thread=False)代替monkey.patch_all()。如果它實際上是修補時引起故障的線程模塊,則應該解決它。 request不使用線程。

+0

謝謝西蒙,我試過這個解決方案,但我一直得到同樣的錯誤。 – raben 2012-03-14 16:29:28

0

我下面貼的答案上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") 

注意瓶可以用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。

相關問題