2015-09-08 52 views
3

我用燒瓶+ gevent構建我的服務器,但名爲'getall'的gevent被燒瓶阻塞,所以'getall'函數無法在此代碼中打印消息。猴子補丁正在使用中。Gevent封鎖燒瓶,甚至使用猴子補丁

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), 
     ]) 

回答

4

你需要傳遞的功能和參數spawn,它將調用與單獨的eventlet這些參數的功能,但現在你實際上是調用run,它永遠不會結束,直到你殺了它。

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

在一個側面說明,這似乎並不喜歡與GEVENT運行瓶的正確途徑。 Flask docs描述使用WSGIServer。此外,您應該在生產環境中使用真正的應用服務器(也就是說,當您不在'localhost'上運行時)。 GunicornuWSGI都能夠使用Gevent處理請求。

+0

嗨,大衛主義,抱歉犯了一個愚蠢的錯誤。正如你所說,這不是用Gevent運行Flask的正確方法。所以我嘗試使用如下代碼的WSGIServer:http_server = WSGIServer(('',8899),app),http_server.serve_forever()。當連接被接受時它會產生一個新的協程。但我不知道如何將'getall'功能加入到我的gevent中。 – vinllen

+0

它看起來像下面的代碼工作正常:gevent.joinall([gevemt.spwan(http_server.serve_forever),gevent.spawn(getall),]) – vinllen