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
xiaoyu9527
V2EX  ›  Python

requests 加了 timeout 为啥还是会卡住?

  •  
  •   xiaoyu9527 · 2017-06-02 00:53:59 +08:00 · 6899 次点击
    这是一个创建于 2738 天前的主题,其中的信息可能已经有所发展或是发生改变。

    conn = request.urlopen(image_url,timeout=300)

    请问有啥优化的办法么?

    爬虫爬了 24 小时卡住了。。 重启启动以后又继续爬了 所以不是被封

    8 条回复    2017-09-22 10:19:19 +08:00
    fzleee
        1
    fzleee  
       2017-06-02 03:05:33 +08:00 via iPhone   ❤️ 2
    我有过类似经历,当然我用的是自带的 urllib。

    后来跟着源代码一路排查,发现卡死在了获取 DNS 的步骤上。很不幸这个 timeout 不包括 DNS 查询时间。

    urllib 直接使用 socket.getaddrinfo 获取 DNS(应该是这个函数,你可以再确认一下),写一个循环重复 1000 次,然后你发现自己的程序卡死了那么你应该遇到了和我一样的状况。

    上面的那个函数触发一个系统调用去获取 DNS,所以当时我的结论是和操作系统相关的一个 bug,高并发请求导致 DNS 会卡死。(
    也有可能是 DNS 服务器的问题?)

    当时的服务器是 ubuntu1204,在相同 vps 服务商那里建一台全新的机器,也会有同样的问题,更换 dns 后问题得到解决。
    12liuxiangyu12
        2
    12liuxiangyu12  
       2017-06-02 09:40:11 +08:00   ❤️ 1
    requests 文档上有写
    Note
    timeout is not a time limit on the entire response download; rather, an exception is raised if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). If no timeout is specified explicitly, requests do not time out.

    在最开始加一个
    import socket
    socket.setdefaulttimeout(时间)
    就可以了
    xiaoyu9527
        3
    xiaoyu9527  
    OP
       2017-06-02 11:04:19 +08:00
    @fzleee 我也感觉是 dns 的问题。因为我再次重试感觉也很顺
    xiaoyu9527
        4
    xiaoyu9527  
    OP
       2017-06-02 11:05:31 +08:00
    @fzleee 我换成阿里 DNS 试试
    ic3z
        5
    ic3z  
       2017-06-03 09:05:45 +08:00 via Android
    @12liuxiangyu12 那如果要下大文件怎么办呢?
    xiaoyu9527
        6
    xiaoyu9527  
    OP
       2017-06-03 11:58:43 +08:00
    换了阿里 DNS 以后。 问题消失。

    竟然还能出现 DNS 的卡 BUG 问题 此贴完结。
    xiaoyu9527
        7
    xiaoyu9527  
    OP
       2017-08-08 16:00:37 +08:00
    @fzleee 换成了阿里 dns 后竟然还出现了这个问题。

    怎么解决
    12liuxiangyu12
        8
    12liuxiangyu12  
       2017-09-22 10:19:19 +08:00
    @ic3z 下大文件也可以,这个超时代表一定时间没有数据传输,你大文件还是在传输的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2838 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 06:52 · PVG 14:52 · LAX 22:52 · JFK 01:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.