这可能是一个愚蠢的问题,但是我缺少了一些我认为很明显的东西:
我正在使用Python 3.8 asyncio流:
import asyncio
async def client_handler():
reader, writer = await asyncio.open_connection('127.0.0.1', 9128)
server_name = writer.get_extra_info('peername')[0]
print(f"Connecting to: { server_name }")
data = b''
close_client = False
try:
while not close_client:
print(data)
data = await reader.read(1024)
print(data)
if data != b'':
print(data.decode('utf-8'))
data = b''
writer.close()
except:
pass
finally:
writer.close()
await writer.wait_closed()
asyncio.run(client_handler())
我想我希望它会尝试读取1024个字节,但是如果那里什么也没有,那么它只会返回None或一个空字节串或其他东西,而只是坐在那里直到接收到数据。
我误会了阅读应该做什么?相反,还有另一种方法可以用来窥探缓冲区或轮询以查看是否确实有数据传入吗?
例如,假设我正在编写一个示例聊天程序服务器和客户端,该服务器和客户端需要能够同时动态发送和接收数据...我如何使用asyncio流实现该功能?我应该改建自己的asyncio.Protocol子类吗?
答案 0 :(得分:1)
您可以使用asyncio.gather()
,asyncio.wait(return_when=FIRST_COMPLETED)
和asyncio.wait_for()
之类的工具在不同的操作之间进行多路复用,例如从不同流中读取数据或进行读写操作。没有有关用例的更多详细信息,很难为您提供具体建议,以继续进行操作。
除非您正在编写非常专业的软件并且确切地知道自己在做什么,否则几乎可以肯定,错误的做法是构建asyncio.Protocol
或直接使用feed_eof()
。