【问题标题】:Gevent blocked by flask even use monkey patchGevent 被烧瓶阻止甚至使用猴子补丁
【发布时间】:2015-09-08 23:36:26
【问题描述】:

我正在使用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),
        ]) 

【问题讨论】:

    标签: python flask gevent flask-restful greenlets


    【解决方案1】:

    您需要将函数和参数传递给 spawn,它会在单独的 eventlet 中使用这些参数调用函数,但现在您实际上是在调用 run,直到您杀死它才会结束。

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

    附带说明,这似乎不是使用 Gevent 运行 Flask 的正确方法。 Flask docs 使用 WSGIServer 描述。此外,您应该在生产中使用真正的应用服务器(即,当您不在“本地主机”上运行时)。 GunicornuWSGI 都能够使用 Gevent 来处理请求。

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 2017-01-25
      • 2012-07-14
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2012-06-14
      • 2016-09-01
      • 2012-09-16
      相关资源
      最近更新 更多