不,你不能指望 socket.sendto 是无阻塞的 .
将数据字节发送到addr给出的远程对等体(传输 - >依赖目标地址) . 如果addr为None,则将数据发送到创建传输时给定的目标地址 . 这种方法不会阻止;它缓冲数据并安排它以异步方式发送出去 .
transport, protocol = await loop.create_datagram_endpoint(factory, sock=sock)
编辑 - 关于您的评论:
socket.sendto()是否等同于transport.sendto()?
不,不是, transport.sendto 使用 loop.add_writer 使操作无阻塞 . 见implementation .
我不想使用这种方法,因为它的实现强制我通过具有回调样式的协议接收数据 .
用法:
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