不希望收到任何消息时如何停止阅读

时间:2018-11-13 06:08:25

标签: python python-3.4 python-asyncio

在下面的代码中,我们异步等待接收数据。但是当不再期待数据时如何停止等待读取。 之所以这样问,是因为我想实现一个类,该类使用asyncio.run_coroutine_threadsafe在单独的线程中继续监听到达的消息,并希望在测试结束后终止监听(以释放套接字连接)。

import asyncio

@asyncio.coroutine
def tcp_echo_client(message, loop):
    reader, writer = yield from asyncio.open_connection('127.0.0.1', 8888,
                                                    loop=loop)

    print('Send: %r' % message)
    writer.write(message.encode())

    data = yield from reader.read(100)
    print('Received: %r' % data.decode())

    print('Close the socket')
    writer.close()

message = 'Hello World!'
loop = asyncio.get_event_loop()
loop.run_until_complete(tcp_echo_client(message, loop))
loop.close()

2 个答案:

答案 0 :(得分:0)

要停止等待,请cancel运行协程的task。例如:

# tcp_echo_client as in your code

message = 'Hello World!'
loop = asyncio.get_event_loop()
task = loop.create_task(tcp_echo_client(message, loop))
loop.call_later(5, task.cancel)  # cancel the task after five seconds
try:
    loop.run_until_complete(task)
except asyncio.CancelledError:
    pass
loop.close()

如果您使用的是asyncio.run_coroutine_threadsafe,请注意它将返回一个concurrent.futures.Future对象,该对象本身具有一个cancel方法。 run_coroutine_threadsafe返回的前途取消将被asyncio注意到,并导致事件循环线程中的任务被取消。

答案 1 :(得分:0)

streamreader没有任何超时https://github.com/python/asyncio/issues/96 因此,一旦您开始阅读,便无法停止。 对我来说,我发送了一封结束语,并在我的客户端中进行了处理,当遇到结束语时,它不应继续阅读。 这就是我停止阅读的方式。 一旦调用reader.read,它将继续等待消息(甚至在调用writer.close之后),并使套接字保持接合状态,直到对象被销毁为止。