Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Flask在Python中进行长轮询_Python_Flask_Long Polling - Fatal编程技术网

使用Flask在Python中进行长轮询

使用Flask在Python中进行长轮询,python,flask,long-polling,Python,Flask,Long Polling,我尝试在Flask框架下使用JQuery和Python进行长轮询 在PHP中做过很长时间的轮询之后,我尝试以同样的方式进行: 一种脚本/函数,具有while(true)循环,定期检查数据库中的更改(例如每0,5秒一次),并在发生更改时返回一些数据 因此,在我的ini.py中,我为JQuery创建了一个app.route to/poll调用。JQuery为它提供一些有关客户端当前状态的信息,poll()函数将此信息与数据库中当前的状态进行比较。循环结束,并在观察到更改时返回信息 下面是python

我尝试在Flask框架下使用JQuery和Python进行长轮询

在PHP中做过很长时间的轮询之后,我尝试以同样的方式进行:

一种脚本/函数,具有while(true)循环,定期检查数据库中的更改(例如每0,5秒一次),并在发生更改时返回一些数据

因此,在我的ini.py中,我为JQuery创建了一个app.route to/poll调用。JQuery为它提供一些有关客户端当前状态的信息,poll()函数将此信息与数据库中当前的状态进行比较。循环结束,并在观察到更改时返回信息

下面是python代码:

@app.route('/poll')
def poll():
client_state = request.args.get("state")

    #remove html encoding + whitesapce from client state
    html_parser = HTMLParser.HTMLParser()
    client_state = html_parser.unescape(client_state)
    client_state = "".join(client_state.split())

    #poll the database
    while True:
        time.sleep(0.5)
        data = get_data()
        json_state = to_json(data)
        json_state = "".join(data) #remove whitespace

        if json_state != client_state:
            return "CHANGE"
问题是,当上面的代码开始轮询时,服务器似乎过载,其他Ajax调用以及其他请求(如使用JQuery将“加载”图像加载到html)都没有响应且超时

为了完整起见,我在这里包括了JQuery:

function poll() {

queryString = "state="+JSON.stringify(currentState);

$.ajax({
    url:"/poll",
    data: queryString,
    timeout: 60000,
    success: function(data) {
        console.log(data);
        if(currentState == null) {
            currentState = JSON.parse(data);
        }
        else {
            console.log("A change has occurred");
        }

        poll();

    },
    error: function(jqXHR, textStatus, errorThrown) {

        console.log(jqXHR.status + "," + textStatus + ", " + errorThrown);

        poll();

    }
});

}
这需要多线程还是什么?或者有人知道我为什么会有这种行为吗

提前谢谢!!:)

就像@Rob一样ᵩ 提到,你的烧瓶应用程序只是超载。这是因为flask应用程序在使用
app.run()
运行时默认处于单线程模式,因此每次只能提供一个请求

您可以通过以下方式启动多线程:

if __name__ == '__main__':
    app.run(threaded=True)
或者使用WSGI服务器(如gunicorn或uwsgi)来提供多处理:

gunicorn -w 4 myapp:app

希望您喜欢Python和Flask

一般来说,尽管WSGI应用程序不适合任何规模的长轮询,但PHP也是如此。这是因为Python在使用WSGI和PHP时都是同步系统,需要一个进程或线程来处理每个请求。因此,要处理大量并发长轮询请求,需要大量的容量(进程或线程)。长轮询最好使用异步web服务器和框架实现。如果使用gunicorn,另一种选择是通过eventlet或gevent workers使用协同路由。但是,这样做确实会对应用程序施加很多限制,因为您只能将客户端用于后端服务和数据库,而这些服务和数据库是协同路由感知的,以避免它们阻塞整个过程。所以协同程序不仅仅是让一切都变得好的魔法。@GrahamDumpleton是的,异步服务器希望Tornado更好,通常这是我构建API或WebSocket服务器的第一选择。