无法使用websocket发送子进程的实时输出

时间:2017-07-08 00:26:31

标签: python asynchronous websocket

我正在编写一个可以运行一组命令的服务器,并通过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上的阻塞读取有关?也许我需要以某种方式产生线程,或使用不同的库(某些异步)来读取进程?

0 个答案:

没有答案