В разделе рассмотрены низкоуровневые методы цикла событий модуля asyncio
, при помощи которых можно создавать асинхронные DNS запросы из низкоуровнего кода.
Прежде чем что-то делать с циклом событий, его необходимо создать или получить функциями, описанными в разделе "Создание, запуск и получение цикла событий".
loop.getaddrinfo(host, port, *, family=0, type=0, proto=0, flags=0)
:Метод loop.getaddrinfo()
представляет собой сопрограмму асинхронной версии функции socket.getaddrinfo()
.
loop.getnameinfo(sockaddr, flags=0)
:Метод loop.getnameinfo()
представляет собой сопрограмму асинхронной версии функции socket.getnameinfo()
.
Изменено в Python 3.7: методы loop.getaddrinfo()
и loop.getnameinfo()
документировались, как возвращающие сопрограмму, но до Python 3.7 они фактически возвращали объекты asyncio.Future
.
Начиная с Python 3.7 оба метода являются сопрограммами.
asyncio
.В примере осуществляется определение имя хоста в сети по его IPv4 адресу.
import asyncio async def get_name(): TARGETS = [ ('8.8.8.8', 443), ('1.1.1.1', 443), ('8.8.4.4', 443), ('77.88.8.8', 443), ('77.88.8.88', 443), ('77.88.8.7', 443) ] # получаем текущий цикл событий loop = asyncio.get_event_loop() for target in TARGETS: # запускаем асинхронный вариант # функции socket.getnameinfo() host, port = await loop.getnameinfo(target) # выводим результаты print(f'{target[0]:15}: {host}') if __name__ == '__main__': asyncio.run(get_name()) # 8.8.8.8 : dns.google # 1.1.1.1 : one.one.one.one # 8.8.4.4 : dns.google # 77.88.8.8 : dns.yandex.ru # 77.88.8.88 : safe.dns.yandex.ru # 77.88.8.7 : family.dns.yandex.ru