gpt4 book ai didi

python3.5 : asyncio, 如何等待 "transport.write(data)"完成或返回错误?

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

我正在使用asyncio在python3.5中编写一个tcp客户端看完How to detect write failure in asyncio?关于高级流 api,我尝试使用低级协议(protocol) api 来实现。

class _ClientProtocol(asyncio.Protocol):
def connection_made(self, transport):
self.transport = transport

class Client:
def __init__(self, loop=None):
self.protocol = _ClientProtocol()

if loop is None:
loop = asyncio.get_event_loop()
self.loop = loop
loop.run_until_complete(self._connect())

async def _connect(self):
await self.loop.create_connection(
lambda: self.protocol,
'127.0.0.1',
8080,
)
# based on https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/#bug-3-closing-time
self.protocol.transport.set_write_buffer_limits(0)

def write(self, data):
self.protocol.transport.write(data)

def wait_all_data_have_been_written_or_throw():
pass

client = Client()
client.write(b"some bytes")
client.wait_all_data_have_been_written_or_throw()

根据Python文档,我知道write是非阻塞的,我希望wait_all_data_have_been_writing_or_throw告诉我是否所有数据都已写入或者是否有问题发生在中间(就像连接丢失,但我认为还有更多的事情可能会变坏,并且底层套接字已经返回了有关它的异常?)

标准库是否提供了这样做的方法?

最佳答案

问题主要与 TCP 套接字功能有关,而不是 asyncio 实现本身。

让我们看一下下面的代码:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send(b'data')

成功的send()调用意味着数据已传输到套接字的内核空间缓冲区中,仅此而已。

数据不是通过有线发送的,没有被对等方接收,显然,也没有被接收到处理。实际的发送是由操作系统内核异步执行的,用户代码无法控制它。

这就是为什么 wait_all_data_have_been_writing_or_throw() 没有多大意义:没有错误的写入并不意味着对等点接收到这些数据,而只是成功地从用户空间缓冲区转移到内核空间缓冲区。

关于python3.5 : asyncio, 如何等待 "transport.write(data)"完成或返回错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48610677/

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