2015-09-08 5 views
3

Я использую флягу + gevent для сборки своего сервера, но gevent с именем «getall» был заблокирован флягой, поэтому функция 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»). Gunicorn и uWSGI оба могут использовать Gevent для обработки запросов.

+0

Привет, Давидомизм, извините за тупую ошибку. Как вы сказали, это не правильный способ запустить Flask с Gevent. Поэтому я пытаюсь использовать WSGIServer, например, следующий код: http_server = WSGIServer (('', 8899), приложение), http_server.serve_forever(). при подключении будет появляться новая сопрограмма. Но я не знаю, как присоединиться к «getall» funtion в моем gevent. – vinllen

+0

Похоже, что следующий код работает нормально: gevent.joinall ([gevemt.spwan (http_server.serve_forever), gevent.spawn (getall),]) – vinllen