c-ares是异步DNS请求库,libcurl,libevent,wireshark都使用了c-ares,gevent1.0版本前使用的是libevent,
所以它的DNS请求也是使用c-ares,1.0版本后使用cython封装了c-ares。
c-ares官方文档,http://c-ares.haxx.se/docs.html。
gevent中DNS默认使用的是线程池版本的,可通过设置GEVENT_RESOLVER=ares环境变量使用c-ares异步库。
如何证明的确是异步呢,试着跑一遍你就知道了?
#coding=utf8
import socket
import gevent
from gevent import get_hub
from gevent.resolver_ares import Resolver
r = get_hub().resolver = Resolver(servers=['8.8.8.8'])
def f(w):
print w,r.gethostbyname(w)
for w in ['www.google.com','www.baidu.com','www.apple.com']:
gevent.spawn(f,w)
gevent.sleep(6)
cares.ares_library_init(cares.ARES_LIB_INIT_ALL)
初始化ares库,其实只对windows平台做了处理,主要是为了加载iphlpapi.dll,在非windows平台可不调用。
如果调用一定要在c-ares任何函数之前调用。
cares.ares_library_cleanup()
相对于c

本文探讨了c-ares库在gevent中的应用,特别是在1.0版本后如何通过cython封装实现异步DNS请求。通过设置环境变量GEVENT_RESOLVER=ares可以启用c-ares。核心函数`ares_init_options`用于初始化,并介绍了其参数如flags、timeout和tries等。ares_set_servers函数用于设置DNS服务器,而ndots参数影响域名查找行为。文章还提到了c-ares如何判断socket状态变化,并在特定情况下关闭socket。作者在研究过程中发现网上关于c-ares的例子匮乏,希望能借此分享加深理解。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



