如何使用异步异步接收数据包



我正在尝试使用异步sock_recv异步接收数据。 我正在以不同的速度将数据从服务器发送到两个不同的端口: 数据 X 每 10 毫秒一次,数据 Y 每 100 毫秒一次。

当使用阻塞套接字 recvfrom 函数时,我每 100 毫秒就会收到 X 和 Y,因为它在 Y recvfrom 中阻塞,所以我尝试使用 asyncio,以便在 Y 等待时我会收到 10 个 X,然后是一个 Y。

为此,我编写了这些函数:

async def recv_data(socket):
data = await loop.sock_recv(socket, 2048)
print(len(data))
async def main():
UDP_IP = "192.168.1.10"
RAW_PORT = 125
MCU_PORT = 126 
SERVER_PORT = 5001
SOCK_RAW = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
SOCK_RAW.bind(('', RAW_PORT))
SOCK_MCU = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
SOCK_MCU.bind(('', MCU_PORT))
while True :       
await asyncio.gather(recv_data(SOCK_RAW), recv_data(SOCK_MCU))

while True:
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

但我得到的并不完全是我所期望的:

576
540
576
540
576
540
540
576
540
576
576
540
576
540
576
540
540
576
540
576

我不是很好地使用异步包吗?


import asyncio
import socket
async def recv_data(c_socket):
while True : # also add an interuption logic as break the loop if empty string or what you have there
data = await loop.sock_recv(c_socket, 2048)
if data == '':
break
print(len(data))
def create_socket(port, host='localhost'):
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('', port))
server.setblocking(False)
return server

async def main():
UDP_IP = "192.168.1.10"
RAW_PORT = 125
MCU_PORT = 126
SERVER_PORT = 5001
servers = [
create_socket(port) for port in { RAW_PORT, MCU_PORT }
]
listen_connections = [ 
loop.create_task( recv_data(server) ) for server in servers 
]
await asyncio.gather(*listen_connections)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

问题出在您的 while 循环中recv_data只接收一次数据并等待再次调用数据,并且 100ms 套接字处的作业未完成意味着循环仍保持相同的迭代,等待时间为 100ms。

我稍微编辑了一下代码,我雾化手表插座没有设置为非阻塞模式,这就是为什么你从一个套接字得到唯一的响应

最新更新