gpt4 book ai didi

python - 当没有收到任何消息时如何停止阅读

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:19 24 4
gpt4 key购买 nike

在下面的代码中,我们异步等待接收数据。但是当不需要更多数据时如何停止等待读取。我问这个问题的原因是因为我想实现一个类,该类使用 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()

最佳答案

要停止等待,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方法。 asyncio 会注意到 run_coroutine_threadsafe 返回的 future 的取消,并导致事件循环线程中任务的取消。

关于python - 当没有收到任何消息时如何停止阅读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53274805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com