Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3.5:asyncio,如何等待;传输.写入(数据)“;完成还是返回错误?_Python_Python 3.x_Python Asyncio - Fatal编程技术网

python3.5:asyncio,如何等待;传输.写入(数据)“;完成还是返回错误?

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.

我正在用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.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?