有没有类似的手术将接收插座插入在python3asyncio中?

2024-04-29 12:18:49 发布

您现在位置:Python中文网/ 问答频道 /正文

Socket模块有一个socket.recv_into方法,因此它可以使用用户定义的bytebuffer(类似于bytearray)进行零拷贝。但也许{}没有这样的方法。有没有一种方法可以在asyncio中使用socket.recv_into这样的方法?在


Tags: 模块方法用户asyncio定义socket拷贝into
3条回答

更新:从python3.7.0开始,在我写这篇文章时,它是alpha版本,标准库的asyncio模块文档AbstractEventLoop.sock_接收到(). 在

编辑:按要求展开答案。。。在

对asyncio的sock_recv_into()的调用通常如下所示:

byte_count = await loop.sock_recv_into(sock, buff)

buff是一个实现Python缓冲区协议的可变对象,其示例包括bytearray和bytearray上的memoryview。下面的代码演示使用memoryview接收到bytearray。在

asyncialsockets的工作演示代码必须包含一组脚手架,用于设置连接的两侧并运行事件循环。这里的重点是在下面的sock_read_exactly()co例程中使用asyncio的sock_recv_into()。在

^{pr2}$

您可以实现自己的异步传输,它利用.recv_into()函数,但是是的,目前asyncio还没有一种现成使用.recv_into()的方法。在

就我个人而言,我怀疑是否有很大的加速:当你用C开发时,零拷贝是极其重要的,但是对于像Python这样的高级语言来说,好处要少得多。在

BaseEventLoop定义的低级套接字操作需要传入socket.socket对象,例如BaseEventLoop.sock_recv(sock, nbytes)。所以,假设你有一个socket.socket,你可以调用sock.recv_into()。这样做是否好是另一个问题。在

相关问题 更多 >