被烧瓶阻塞的Gevent甚至使用猴子补丁
Gevent blocked by flask even use monkey patch
我正在使用 flask+gevent 构建我的服务器,但是名为 'getall' 的 gevent 被 flask 阻止了,所以 'getall' 函数无法在这段代码中打印消息。猴子补丁正在使用中。
import time
import WSGICopyBody
from flask import Flask
import gevent
def handle_node_request() :
while True :
print 'in handle_node_request'
gevent.sleep(1)
def getall() :
print 'in getall'
def create_app() :
app = Flask(__name__)
app.wsgi_app = WSGICopyBody.WSGICopyBody(app.wsgi_app)
app.add_url_rule('/node',
'handle_node_request',
handle_node_request,
methods=['GET', 'PUT', 'POST', 'DELETE'])
return app
if __name__ == "__main__":
app = create_app()
from gevent import monkey
monkey.patch_all()
gevent.joinall([
gevent.spawn(app.run(host='0.0.0.0', port=8899, debug=True)),
gevent.spawn(getall),
])
您需要将函数和参数传递给 spawn
,这将在单独的 eventlet 中使用这些参数调用函数,但现在您实际上正在调用 run
,直到您杀了它。
gevent.spawn(app.run, host='0.0.0.0', port=8899, debug=True)
附带说明一下,这似乎不是 运行 Flask with Gevent 的正确方法。 Flask docs describe using WSGIServer
. Additionally, you should use a real app server in production (that is, when you're not running on 'localhost'). Gunicorn and uWSGI 都可以使用 Gevent 处理请求。
我正在使用 flask+gevent 构建我的服务器,但是名为 'getall' 的 gevent 被 flask 阻止了,所以 'getall' 函数无法在这段代码中打印消息。猴子补丁正在使用中。
import time
import WSGICopyBody
from flask import Flask
import gevent
def handle_node_request() :
while True :
print 'in handle_node_request'
gevent.sleep(1)
def getall() :
print 'in getall'
def create_app() :
app = Flask(__name__)
app.wsgi_app = WSGICopyBody.WSGICopyBody(app.wsgi_app)
app.add_url_rule('/node',
'handle_node_request',
handle_node_request,
methods=['GET', 'PUT', 'POST', 'DELETE'])
return app
if __name__ == "__main__":
app = create_app()
from gevent import monkey
monkey.patch_all()
gevent.joinall([
gevent.spawn(app.run(host='0.0.0.0', port=8899, debug=True)),
gevent.spawn(getall),
])
您需要将函数和参数传递给 spawn
,这将在单独的 eventlet 中使用这些参数调用函数,但现在您实际上正在调用 run
,直到您杀了它。
gevent.spawn(app.run, host='0.0.0.0', port=8899, debug=True)
附带说明一下,这似乎不是 运行 Flask with Gevent 的正确方法。 Flask docs describe using WSGIServer
. Additionally, you should use a real app server in production (that is, when you're not running on 'localhost'). Gunicorn and uWSGI 都可以使用 Gevent 处理请求。