我正在编写一个可以运行一组命令的服务器,并通过websocket将这些命令的输出发送到浏览器。我正在使用Flask-SocketIO
。使用这样的代码,我可以向客户端发送一堆消息:
def echo_a_bunch(thing):
for _ in range(1, 11):
socketio.emit('message', {'data': thing}, namespace="/test")
socketio.sleep(0.5)
@socketio.on('echo', namespace='/test')
def test_message(message):
build_id = uuid.uuid4().hex
socketio.start_background_task(echo_a_bunch, message['data'])
当我在客户端上设置了相应的代码时,我可以发送一条“echo”消息并将其发回10次,每半秒一次。
但我真正想做的是回流子流程的输出。让我们尝试使用子进程执行相同的操作:
def echo_a_bunch(thing):
bash_cmd = "for _ in $(seq 1 10); do echo '{}'; sleep 0.5; done".format(thing)
cmd = ["bash", "-c", bash_cmd]
proc = Popen(cmd, stdout=PIPE)
for line in proc.stdout:
thing = line.decode('utf-8').strip()
socketio.emit('message', {'data': thing}, namespace="/test")
proc.wait()
在这种情况下,相同的数据最终会被发送,但是在整个命令完成之前它不会到达客户端,所以大约5秒钟。
我不确定为什么会这样,但我怀疑它与进程'stdout上的阻塞读取有关?也许我需要以某种方式产生线程,或使用不同的库(某些异步)来读取进程?