V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
noobpythoner
V2EX  ›  Python

使用了 socket 的 dns 缓存,为什么速度还变慢了呢

  •  
  •   noobpythoner · 2017-10-07 11:52:21 +08:00 · 3190 次点击
    这是一个创建于 2385 天前的主题,其中的信息可能已经有所发展或是发生改变。

    查了一下网上关于socket关于dns缓存的代码,希望提高网络请求的速度,
    自己在代码中使用了以后,发现速度反倒慢了,为什么呢 下面的 100 个请求中,使用了缓存之后时间增加了 4 秒多, 10 个请求的时候,时间增加了 0.2 秒左右

    # coding=utf-8
    import requests
    import time
    import socket
    _dnscache = {}
    
    def _setDNSCache():
        """ DNS 缓存 """
        def _getaddrinfo(*args, **kwargs):
            if args in _dnscache:
                # print (str(args) + " in cache")
                return _dnscache[args]
            else:
                # print (str(args) + " not in cache")
                _dnscache[args] = temp_getaddrinfo(*args, **kwargs)
                return _dnscache[args]
    
        if not hasattr(socket, '_getaddrinfo'):
            temp_getaddrinfo = socket.getaddrinfo
            socket.getaddrinfo = _getaddrinfo
    
    class TiebaSpider:
        def __init__(self,tieba_name):
            self.tieba_name = tieba_name
            self.headers = {
                    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
                }
        def get_url_list(self):
            url_temp = "https://tieba.baidu.com/f?kw=" + self.tieba_name + "&ie=utf-8&pn={}"
            url_list = [url_temp.format(i*50) for i in range(100)]
            return url_list
    
        def parse_url(self,url):
            print("now parsing url",url)
            response = requests.get(url,headers=self.headers)
            return response.content.decode()
    
        def run(self):
            url_list = self.get_url_list()
            for url in url_list:
                html_str = self.parse_url(url)
    
    if __name__ == '__main__':
        t1 = time.time()
        _setDNSCache()
        tieba_spider = TiebaSpider("李毅")
        tieba_spider.run()
        print(time.time()-t1)
    
    3 条回复    2017-10-08 10:49:02 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2017-10-07 12:27:25 +08:00
    你是不是应该先测试一下缓存命中率
    shn7798
        2
    shn7798  
       2017-10-07 13:41:06 +08:00   ❤️ 1
    除了第一个请求,后续的请求应该的都是命中缓存的。
    不过百度服务器毕竟不是放在你旁边,同样的 URL 每次的网络耗时都是不同的,所以这样用来对比是没啥意义的。

    我的感觉瓶颈不在 DNS,建议使用 https://github.com/rkern/line_profiler 这个工具来分析一下每行代码的耗时,这样就能找出瓶颈了。
    mengskysama
        3
    mengskysama  
       2017-10-08 10:49:02 +08:00 via iPhone
    这个 dns 缓存意义不大,系统本来就有一层 dns 缓存。我猜换成 session 会快很多,时间都花在 ssl 隧道和 tcp 握手
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5059 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:16 · PVG 09:16 · LAX 18:16 · JFK 21:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.