解决python脚本连接终止问题_python – 在firefox断开连接后,Flask sse-stream没有终止...

我正在尝试创建一个使用sse将数据流式传输到客户端的Flask服务器.下面的测试代码似乎可以解决问题,但我偶然发现了与处理客户端断开相关的问题.

使用Firefox作为客户端(版本28或29)时,数据按预期开始流式传输.但是,当我重新加载页面时,会打开一个新流(如预期的那样),但旧流仍然存在.处理流的eventgen()线程永远不会终止.在其他客户端(我使用Yaffle的Polyfill EventSource实现以及Chrome尝试IE),重新加载或关闭页面会导致客户端断开连接,从而导致服务器端套接字错误10053(客户端与主机断开连接).这将终止循环并仅使活动流保持活动状态,这是预期的行为.

使用Process Explorer,我注意到客户端(Firefox)端的TCP连接挂起状态FIN_WAIT2,而服务器端的连接挂起状态CLOSE_WAIT.奇怪的是,在运行Firefox的3台机器中的1台(所有Win 7 x64)上我测试了这一点,断开连接正确处理.在Python 2.6.5和2.7.6上运行产生了相同的结果.

我还尝试用基于greenlet的gevent WSGIserver替换内置的Flask服务器,但这会产生完全相同的行为.此外,应该使用某种形式的线程/ eventlet,因为否则运行eventgen()循环会阻塞服务器.

下面的测试代码在浏览到localhost:5000时为make_html()中定义的页面提供服务,并打开一个到/ stream的流.该流显示格式{“content”:0.5556278827744346,“local_id”:4,“msg”:6}的按摩,其中local_id是打开的流的id,msg是此流中当前消息的编号.

import time, random

import flask

from flask import Flask, json

def make_html():

return """

var source = new EventSource('/stream');

source.onmessage = function (event) {

var data = event.data;

var logdiv = $('#log');

logdiv.empty();

logdiv.append('

' + data + '
');

};

Log

Log ...


"""

# ---- Flask app ----

app = Flask(__name__)

@app.route('/')

def index():

return make_html()

counter = 0

def eventgen():

global counter

counter += 1

local_id = counter

msg_count = 0

while True:

msg_count += 1

data = {'msg': msg_count, 'content': random.random(), 'local_id': local_id}

data = json.dumps(data)

yield 'data: ' + data + '\n\n'

print local_id, ':', data

time.sleep(0.5)

@app.route('/stream')

def eventstream():

return flask.Response(eventgen(), mimetype="text/event-stream")

if __name__ == '__main__':

app.run(threaded=True)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值