#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