gpt4 book ai didi

unix - 如何用 asyncio 实现 recvmsg()?

转载 作者:行者123 更新时间:2023-12-05 05:23:18 26 4
gpt4 key购买 nike

recvmsg()asyncio 中丢失模块,我试图以与 BaseEventLoop.sock_recv() 完全相同的方式重新实现它已实现:

import asyncio, socket


def _sock_recvmsg(loop, fut, registered, sock, bufsize, ancbufsize):
self = loop
fd = sock.fileno()
if registered: self.remove_reader(fd)
if fut.cancelled(): return
try: data = sock.recvmsg(bufsize, ancbufsize)
except (BlockingIOError, InterruptedError): self.add_reader(fd, self._sock_recvmsg, fut, True, sock, bufsize, ancbufsize)
except Exception as exc: fut.set_exception(exc)
else: fut.set_result(data)


def sock_recvmsg(loop, sock, bufsize, ancbufsize=0):
self = loop
if self._debug and sock.gettimeout() != 0: raise ValueError('the socket must be non-blocking')
fut = asyncio.futures.Future(loop=self)
self._sock_recvmsg(fut, False, sock, bufsize, ancbufsize)
return fut


asyncio.unix_events._UnixSelectorEventLoop._sock_recvmsg = _sock_recvmsg
asyncio.unix_events._UnixSelectorEventLoop.sock_recvmsg = sock_recvmsg

但是这个简单的测试失败了,只收到第一个值,然后测试挂起:

async def produce():
for i in range(5):
end_out.sendmsg([bytes([i])])
await asyncio.sleep(1)

end_out.close()

async def consume():
while True:
v, a, b, c = await asyncio.get_event_loop().sock_recvmsg(end_in, 1)
if v == b'': return
print(v)

if __name__ == '__main__':
end_in, end_out = socket.socketpair()
asyncio.ensure_future(produce())
asyncio.get_event_loop().run_until_complete(consume())

我错过了什么?

最佳答案

recvmsg()相关代码是正确的,但我漏掉了

end_in.setblocking(0)
end_out.setblocking(0)

这太愚蠢了,所以我正在考虑删除那个问题。

关于unix - 如何用 asyncio 实现 recvmsg()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38235997/

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