4

共有ホスティング(Webfaction)でApache(mod_wsgi)とgeventを使用して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

python-requestsの非同期モジュールを使用して同時HTTPリクエストを作成しているため、geventが必要です。私は周りをグーグルしようとしましたが、私が見つけた唯一のアドバイスは電話することです

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

この問題を解決するためのアドバイスはありますか?

4

3 に答える 3

2

私は自分で解決策を見つけたようです。次のディレクティブは私の問題を解決しました:

WSGIApplicationGroup %{GLOBAL}

このアイデアは、クラッシュし続ける WSGI プロセスの問題を解決するために WSGIApplicationGroup を GLOBAL に設定することが提案されている別の回答から来ています。WSGIのドキュメントから

Python の初期化時に作成された最初の Python サブ インタープリター内で特定の WSGI アプリケーションを強制的に実行するには、WSGIApplicationGroup ディレクティブを使用し、グループを「%{GLOBAL}」に設定する必要があります。

このディレクティブが私の問題を解決する理由を完全には理解できませんが、そうです。誰かがこれを平易な英語で説明できれば、私はとても幸せです;-)

于 2012-03-14T21:17:14.317 に答える
1

に置き換えmonkey.patch_all()てみてくださいmonkey.patch_all(thread=False)。パッチを適用したときに問題を引き起こしているのが本当にスレッド化モジュールである場合は、これで解決するはずです。requestスレッドを使用しません。

于 2012-03-14T15:23:01.770 に答える