為什麼在 mod_wsgi 部署的 Flask api 中使用 gevent 的方法會引發有關切換執行緒的錯誤?
我正在嘗試通過 Apache/mod_wsgi 部署 Flask api。api 使用 Gevent 為遞歸方法提供並發性。但是,它拋出以下錯誤
[Mon Feb 08 12:05:37 2016] [error] error: cannot switch to a different thread [Mon Feb 08 12:05:37 2016] [error] <callback at 0x1094ee350 args=()> failed with error
當使用 Pycharm 的內置 Web 伺服器執行時,整個 api 使用 Gevent 執行良好,當我不使用 gevent 提供並發時,使用 Apache/mod_wsgi 部署的 api 執行良好。
我認為這應該可以在 Apache 中執行,但到目前為止我還沒有找到解決方案。我不斷看到提到猴子更新檔,所以我將此行添加到呼叫 gevent 的模組中
from gevent import monkey; monkey.patch_all()
但是,這似乎沒有幫助。
我在 Flask 文件 ( http://flask.pocoo.org/docs/0.10/deploying/wsgi-standalone/ )中的獨立 WSGI 容器上發現了這一點:
Gevent is a coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of libevent event loop: from gevent.wsgi import WSGIServer from yourapplication import app http_server = WSGIServer(('', 5000), app) http_server.serve_forever()
它還說
There are popular servers written in Python that contain WSGI applications and serve HTTP. These servers stand alone when they run; you can proxy to them from your web server. Note the section on Proxy Setups if you run into issues.
我是否需要放棄使用 mod_wsgi 並使用 Gevent 內置的 WSGI 伺服器,然後通過 Apache 代理它?這將是一個皇家 PITA,特別是處理 CORS 問題(我們有一個 Web UI 可以訪問同一伺服器上的 api,並且從不同的埠代理會導致大量跨源問題 - 除非有人能說服我否則)。
任何有關下一步嘗試的見解將不勝感激。
apache mod_wsgi 目前與 gevent 不兼容。對於帶有 Apache 的 AWS elastic 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。
我剛剛在這裡找到了一個類似的執行緒https://stackoverflow.com/questions/9692089/why-gevent-on-a-flask-app-with-apache-mod-wsgi-is-raising-notimplementederror有解決方案.
要執行我需要的操作,我必須將指令添加
WSGIApplicationGroup %{GLOBAL}
到我的 Apache conf。我也很好奇為什麼這可以解決問題。