我有一个带有websockets(socketIO)的Flask Python webserver。
我想运行一个命令并将输出流式传输到<p id='streaming_text'>
HTML元素。
这是我的代码:
HTML
div class='streaming'>
<p id="streaming_text"></p>
</div>
JQuery的
var socket = io.connect('http://' + document.domain + ':' + location.port + '/stream')
socket.on('message', function(msg){
$('#streaming_text').append(msg);
})
...
jqxhr.done(function(cmd){
socket.send(cmd)
return false;
})
的Python
@socketio.on('message', namespace='/stream')
def stream(cmd):
# Streams output of a command
print("Received msg %s from JS socket" % cmd)
print("Executing %s" % cmd)
from shelljob import proc
g = proc.Group()
p = g.run(cmd)
while g.is_pending():
lines = g.readlines()
for proc, line in lines:
print(line)
send(line, namespace='/stream')
在浏览器控制台中,我看到所有send(line)
都在同一时间执行:命令运行完毕后。但是,print(line)
会实时显示我的命令输出。
我运行的命令平均需要15分钟才能运行,因此在没有看到任何输出的情况下必须等待那么长时间才会有糟糕的用户体验。
如何在不等待命令结束的情况下立即发送这些消息?
答案 0 :(得分:0)
要回答我自己的问题,我在Python代码中每次eventlet.sleep(0)
调用后添加:send
解决了这个问题。
新代码是这样的:
<强>的Python 强>
@socketio.on('message', namespace='/stream')
def stream(cmd):
# Streams output of a command
print("Received msg %s from JS socket" % cmd)
print("Executing %s" % cmd)
from shelljob import proc
g = proc.Group()
p = g.run(cmd)
while g.is_pending():
lines = g.readlines()
for proc, line in lines:
print(line)
send(line, namespace='/stream')
显然这似乎是在刷新消息,所以实际上会立即将它们发送到您用来接收它们的任何代码,在我的例子中是一个JavaScript(JQuery)脚本。
来源: https://github.com/miguelgrinberg/Flask-SocketIO/issues/141