Apache + mod_wsgiを持つフラスコアプリでGeventがIngemplementedErrorを上げるのはなぜですか?
質問
私はApache(mod_wsgi)を使って私のフラスコアプリを展開する問題を持っています 共有ホスティング(Webfaction)のGevent。
アプリケーションはフラスコによって提供される開発サーバではうまくいっていますが、i ログファイルに次のエラーが表示されます。
[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
.
私は python-を使用しているので、Geventが必要です。依頼の非同期モジュール TO 同時HTTPリクエストを作成します。 私はまとめてグーグルしようとしましたが、私が見つけた唯一のアドバイスは
と呼ぶことです。from gevent import monkey
monkey.patch_all()
.
私がすでに私のコードでやっているもの。
WSGIDaemonProcess
の値は次のとおりです。
WSGIDaemonProcess myapp processes=5 python-path=/home/myusername/webapps/myapp/lib/python2.7 threads=1
.
これはmy httpd.confです: http://pastebin.com/ewygicjh
誰でもこの問題を解決するためのアドバイスを持っていますか?
解決
私は解決策を自分で見つけたようです。次の指示は私の問題を解決しました:
WSGIApplicationGroup %{GLOBAL}
.
アイデアは別の答え WSGIプロセスで問題を解決するためにWSGiApplicationGroupをグローバルに設定することをお勧めします。クラッシュし続けます。 WSGI Documentation :
特定のWSGIアプリケーションを最初に稼働させるように強制する Pythonが初期化されたときに作成されたPython Subインタプリタ、 WSGiApplicationGroupディレクティブを使用し、グループを設定する必要があります。 '%{Global}' '。
この指令が私の問題を解決するのかを理解することはできませんが、そうです。誰かが私にこれを普通の英語で説明することができるならば、私は幸せ以上になるでしょう。 - )
他のヒント
monkey.patch_all()
をmonkey.patch_all(thread=False)
に置き換えてみてください。それが本当にトラブルを与えているスレッドモジュールであれば、これはそれを解決するはずです。request
はスレッドを使用しません。
私は以下のように答えました https://servault.com/a/869625/355861
apache mod_wsgiは現在Geventと互換性がありません。ApacheでAWS Elastic Beanstalkの場合は、フラスコにasync_mode="スレッド"を使用しました。注意、スレッドは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)
.