python3.5:asyncio,如何等待;传输.写入(数据)“;完成还是返回错误?
我正在用python3.5编写一个tcp客户端,使用python3.5:asyncio,如何等待;传输.写入(数据)“;完成还是返回错误?,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我正在用python3.5编写一个tcp客户端,使用asyncio 在阅读了关于高级流式api的讨论之后,我尝试使用低级协议api来实现 class _ClientProtocol(asyncio.Protocol): def connection_made(self, transport): self.transport = transport class Client: def __init__(self, loop=None): self.
asyncio
在阅读了关于高级流式api的讨论之后,我尝试使用低级协议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文档,我知道<代码>写<代码>是非阻塞的,并且我希望<代码> Wavi-AlxDATAA.DaaaHyv.BeNeWordTynOrthOrthPox<代码>告诉我,所有的数据是否已经写入,或者在中间发生了什么不好的事情。(就像一个连接丢失,但我假设还有更多的事情会坏掉,并且底层套接字已经返回了关于它的异常?)
标准库是否提供了这样做的方法?问题主要与TCP套接字功能有关,而不是异步IO实现本身
让我们看看下面的代码:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send(b'data')
成功的send()
调用意味着数据已传输到套接字的内核空间缓冲区,仅此而已
数据不是通过有线发送的,不是由对等方接收的,显然,也不是由接收方处理的。
实际发送是由操作系统内核异步执行的,用户代码无法控制它
为什么等待\u所有数据\u都已写入\u或\u抛出()
没有多大意义:无错误写入并不意味着对等方接收到这些数据,而只是成功地从用户空间缓冲区移动到内核空间缓冲区。好的,所以即使只查找linux特定的接口,知道数据已写入的唯一方法是让服务器在应用层上回复某些内容,对吗t?无法访问TCP的ACK?