读取龙卷风直到关闭方法错误

时间:2018-07-25 06:54:08

标签: python-3.x tornado tcpserver

我正在尝试用龙卷风在python中创建TCP服务器。 我的句柄流方法看起来像这样,

async def handle_stream(self, stream, address):
    while True:
        try:
            stream.read_until_close(streaming_callback=self._on_read)
        except StreamClosedError:
            break

_on_read方法中,我试图读取和处理数据,但是每当新客户端连接到服务器时,它都会显示AssertionError: Already reading错误。

 File "/.local/lib/python3.5/site-packages/tornado/iostream.py", line 525, in read_until_close
    future = self._set_read_callback(callback)
  File "/.local/lib/python3.5/site-packages/tornado/iostream.py", line 860, in _set_read_callback
    assert self._read_future is None, "Already reading"

1 个答案:

答案 0 :(得分:2)

read_until_close异步地从套接字读取所有数据,直到关闭为止。 read_until_close必须被调用一次,但是循环会强制执行第二个调用,这就是您收到错误的原因:

  • 在第一次迭代中,read_until_close设置streaming_callback并返回Future,以便您可以等待或稍后使用;
  • 在第二次迭代中,read_until_close引发异常,因为您已经在第一次迭代中设置了回调。

read_until_close返回Future对象,您可以await使它起作用:

async def handle_stream(self, stream, address):
    try:
        await stream.read_until_close(streaming_callback=self._on_read)
    except StreamClosedError:
        # do something