Асинхронный DNS-клиент

446 views
Skip to first unread message

Alexander Lourier

unread,
Nov 6, 2010, 1:48:55 PM11/6/10
to ru-python-async
Представляю вашему вниманию асинхронный DNS-клиент с поддержкой stackless.
Он основан на коде python-adns, использующем libadns.
Я сделал его частью пакета concurrence
(https://github.com/amlinux/concurrence), но можно использовать и как
отдельный модуль - лежит в аттаче. Требует установленного пакета python-adns
(http://code.google.com/p/adns-python/)

Его можно использовать как в синхронном режиме (полная совместимость с обычным
модулем ADNS):

from concurrence.dns import *
engine = QueryEngine()
print engine.synchronous("www.yandex.ru", adns.rr.ADDR)

В этом случае программа заблокируется, пока не приедет ответ от DNS. Чтобы
запустить асинхронный режим, достаточно добавить одну букву:

print engine.asynchronous("www.yandex.ru", adns.rr.ADDR)

И всё, программа более не будет блокироваться при запросе.

Из дополнительных вкусностей - по умолчанию адреса DNS-серверов берутся
из /etc/resolv.conf, но можно предоставить и свою конфигурацию, например:

engine = QueryEngine(configtext="nameserver 8.8.8.8")

Один QueryEngine может обрабатывать множество одновременных запросов. Можно
запустить несколько QueryEngine - проблем не будет.

Вот пример работы программы, которая запускает 100 тасклетов и каждый из них
запрашивает адрес через гугловый DNS 8.8.8.8. Сначала синхронно:

real 0m5.125s
user 0m0.060s
sys 0m0.008s

А потом асинхронно:

real 0m0.145s
user 0m0.076s
sys 0m0.068s

dns.py

Alexander Lourier

unread,
Nov 6, 2010, 1:53:35 PM11/6/10
to ru-pyth...@googlegroups.com
On Saturday 06 November 2010 20:48:55 Alexander Lourier wrote:

UPD. Несвежую версию приаттачил. Сейчас нормальная.

dns.py
Reply all
Reply to author
Forward
0 new messages