即使使用猴子补丁也会被烧瓶阻塞的Gevent

时间:2015-09-08 13:02:11

标签: python flask gevent flask-restful greenlets

我使用flask + gevent来构建我的服务器,但名为' getall'被烧瓶阻塞了,所以' 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),
        ]) 

1 个答案:

答案 0 :(得分:4)

你需要将函数和参数传递给spawn,它将在单独的eventlet中使用这些参数调用函数,但是现在你实际上正在调用run,它永远不会结束,直到你杀了它

gevent.spawn(app.run, host='0.0.0.0', port=8899, debug=True)

另外,这似乎不是使用Gevent运行Flask的正确方法。 Flask docs使用WSGIServer进行描述。此外,您应该在生产中使用真正的应用服务器(也就是说,当您未在' localhost'上运行时)。 GunicornuWSGI都能够使用Gevent处理请求。