Получение сокетов, блокирующих асинхронность?

#python #sockets #async-await #udp #python-asyncio

#python #сокеты #асинхронный-ожидание #udp #python-asyncio

Вопрос:

Следующий код печатается 1 каждую секунду, а также пытается получить udp-пакеты от 244.0.2.60:4445

 import socket
import struct
import asyncio

multicast_group = '224.0.2.60'
server_address = ('', 4445)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

async def check_server():
    while True:
        print(1)
        await asyncio.sleep(1)
            

async def tag_server():
    while True:
        data, address = sock.recvfrom(1024)
        data = data.decode("utf-8")
        print(data, address)

# Create tasks
async def main():
    await asyncio.gather(check_server(),tag_server())

# Run
asyncio.run(main())
 

Я ожидаю, что он вернет следующий путь

 1
1 # print 1 every second
1
1
b'packet' # receives packet
1
1
1
b'packet'
1
1
 

Что я получаю, это :

 1
 

Почему получение пакетов блокирует мою программу? Что я могу сделать, чтобы исправить это?

Комментарии:

1. «recvfrom» — это блокирующий синхронный метод, который блокирует весь цикл асинхронных событий. Вместо этого см. asyncio.loop.create_datagram_endpoint