使用Flask在Python中进行长轮询

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

在PHP中进行了长时间的轮询之后,我尝试以相同的方式进行处理:

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

因此,在我的ini .py文件中,我创建了一个到/ poll的app.route,以供JQuery调用。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();

}

});

}

是否需要多线程?还是有人知道为什么我会遇到这种现象?

回答:

flask应用程序只是重载。这是因为在运行时app.run(),flask应用默认情况下处于单线程模式,因此每次只能处理一个请求。

你可以使用以下方法启动多线程:

if __name__ == '__main__':

app.run(threaded=True)

或使用诸如gunicorn或uwsgi之类的WSGI服务器为烧瓶进行多重处理:

gunicorn -w 4 myapp:app

希望你喜欢使用Python和Flask!

以上是 使用Flask在Python中进行长轮询 的全部内容, 来源链接: utcz.com/qa/431908.html

回到顶部