4

我在使用 Apache (mod_wsgi) 和 gevent 在共享主机 (Webfaction) 上部署我的 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

我需要 gevent,因为我正在使用python-requests 的异步模块来发出并发 HTTP 请求。我试着用谷歌搜索,但我发现的唯一建议是打电话

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}

这个想法来自另一个答案,建议将 WSGIApplicationGroup 设置为 GLOBAL 以解决不断崩溃的 WSGI 进程的问题。来自 WSGI 文档

要强制特定的 WSGI 应用程序在 Python 初始化时创建的第一个 Python 子解释器中运行,应使用 WSGIApplicationGroup 指令并将组设置为 '%{GLOBAL}'。

无法完全理解为什么该指令可以解决我的问题,但确实可以。如果有人能够用简单的英语向我解释这一点,我会非常高兴;-)

于 2012-03-14T21:17:14.317 回答
1

尝试替换monkey.patch_all()monkey.patch_all(thread=False). 如果确实是线程模块在修补时引起了麻烦,这应该可以解决。request不使用线程。

于 2012-03-14T15:23:01.770 回答
0

我在https://serverfault.com/a/869625/355861上发布了以下答案

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。

于 2017-08-20T21:44:40.110 回答