Apache-2.4

為什麼在 mod_wsgi 部署的 Flask api 中使用 gevent 的方法會引發有關切換執行緒的錯誤?

  • August 20, 2017

我正在嘗試通過 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。我也很好奇為什麼這可以解決問題。

引用自:https://serverfault.com/questions/754841