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