gpt4 book ai didi

python-3.5 - 假设 socket.sendto 是非阻塞操作是否安全?

转载 作者:行者123 更新时间:2023-12-01 13:41:11 31 4
gpt4 key购买 nike

我有一个使用 socket(AF_INET, SOCK_DGRAM) 创建的套接字对象,我将在异步循环中使用它。但是我在 https://docs.python.org/3/library/asyncio-eventloop.html#low-level-socket-operations 中找不到 sendto 函数.

我可以安全地假设这个函数是一个可以在异步循环中调用的非阻塞系统调用吗?或者我应该提交它在另一个线程中使用 run_in_executor 运行吗?

** Documentation声明它执行一个系统调用,我担心它可能会阻塞整个循环。

最佳答案

不,您不能期望 socket.sendto 是非阻塞的。

相反,使用 DatagramTransport.sendto :

Send the data bytes to the remote peer given by addr (a transport-> dependent target address). If addr is None, the data is sent to the target address given on transport creation.

This method does not block; it buffers the data and arranges for it to be sent out asynchronously.

数据报传输由 loop.create_datagram_endpoint 返回协程:

transport, protocol = await loop.create_datagram_endpoint(factory, sock=sock)

编辑 - 关于您的评论:

Is socket.sendto() equivalent to transport.sendto()?

不,不是,transport.sendto 使用loop.add_writer 使操作成为非阻塞的。查看implementation .

I do not want to use this method because of it's implementation which enforce me to receive data through protocol with callback style.

较低级别的 asyncio 基于回调,asyncio 不为 UDP 提供基于协程的对象。但是,我写了一个module that provides high-level UDP endpoints for asyncio .

用法:

async def main():
local = await open_local_endpoint()
remote = await open_remote_endpoint(*local.address)
remote.write(b'Hey Hey, My My')
data, addr = await local.read()
message = "Got {data!r} from {addr[0]} port {addr[1]}"
print(message.format(data=data.decode(), addr=addr))

输出:

Got 'Hey Hey, My My' from 127.0.0.1 port 45551

关于python-3.5 - 假设 socket.sendto 是非阻塞操作是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40085318/

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