我在python中编写了一个简单的多线程游戏服务器,为每个客户端连接创建一个新线程.我发现时不时,服务器会因为管道损坏/ SIGPIPE错误而崩溃.当程序试图将响应发送回不再存在的客户端时,我非常确定它正在发生.
处理这个问题的好方法是什么?我的首选解决方案只是关闭与客户端的服务器端连接并继续,而不是退出整个程序.
PS:这个问题/答案以一般方式处理问题; 具体应该如何解决?
我有一个烧瓶REST端点,它执行一些cpu密集型图像处理,并需要几秒钟才能返回.通常,此端点被调用,然后由客户端中止.在这些情况下,我想取消处理.我怎么能在烧瓶中做到这一点?
在node.js中,我会做类似的事情:
req.on('close', function(){
//some handler
});
Run Code Online (Sandbox Code Playgroud)
我期待烧瓶有类似的东西,或者我可以在处理过程中检查某些点的同步方法(request.isClosed()),如果关闭则返回,但我找不到.
我考虑发送一些东西来测试连接是否仍然打开,如果失败则捕获异常,但似乎Flask缓冲所有输出,因此在处理完成并尝试返回结果之前不会抛出异常:
已建立的连接已由主机中的软件中止
如果客户端中止他们的请求,我怎样才能取消处理中途?
我希望能够访问一个网页,它将运行一个python函数并在网页中显示进度.
因此,当您访问该网页时,您可以看到脚本的输出,就像您从命令行运行它一样.
根据这里的答案
我正在尝试显示PYTHON的输出
我试图使用Markus Unterwaditzer的代码和python函数.
import flask
import subprocess
app = flask.Flask(__name__)
def test():
print "Test"
@app.route('/yield')
def index():
def inner():
proc = subprocess.Popen(
test(),
shell=True,
stdout=subprocess.PIPE
)
while proc.poll() is None:
yield proc.stdout.readline() + '<br/>\n'
return flask.Response(inner(), mimetype='text/html') # text/html is required for most browsers to show the partial page immediately
app.run(debug=True, port=5005)
Run Code Online (Sandbox Code Playgroud)
它运行但我在浏览器中看不到任何内容.