http://uwsgi-docs.readthedocs.io/en/latest/Gevent.html?highlight=gevent
を見つつ、uwsgiをgeventモードで動かしてみます。
環境
nginx: 1.10.1
python: 2.7.10
uwsgi: 2.0.13.1
ローカル構築なのでnginx-uwsgiはUnixドメインソケットで通信します。
uwsgi設定
geventパラメータを追加
[uwsgi]
...
gevent = 40
ここの値はgeventのworker数ですが、最適な値はわかりません。
(誰か教えてほしい)
MySQLモジュール
MySQLコネクタはMySQLPythonだとgeventが対応していないらしいです。
PyMySQLを使います。
また、Djangoを使う場合はPyMySQLをそのまま使うとバックエンドの実装とかみ合わないので起動時に、
import pymysql
pymysql.install_as_MySQLdb()
を実行する必要があります。
モンキーパッチ
uwsgiの起動モジュールの先頭で、
import gevent.monkey
gevent.monkey.patch_all()
でモンキーパッチを当てる。
(他のインポートの前に実行されるように)
uwsgi.ini内で、gevent-monkey-patch = true でもいけるらしいですが、
手元の環境ではMySQL周りでエラーが出てしまいダメでした。
おそらく内部のインポートの順序の関係かと。
実行
通常通りuwsgi実行して、
*** running gevent loop engine [addr:0x10e228440] ***
のようなメッセージが表示されればgeventモードで起動成功です。
あとはHTTPリクエストしてみてエラーが出なければOK。
起動してみて
geventなしとイマイチ違いが実感しにくい(ローカルだからか)です。
パラメータの値も最適値がまだまだわからないので色々試して検証します。