【问题标题】:pycurl nosignal & timeout <= 999mspycurl nosignal & timeout <= 999ms
【发布时间】:2013-04-26 11:37:39
【问题描述】:
import pycurl

pycurl.version
# libcurl/7.29.0 GnuTLS/2.12.23 zlib/1.2.7 libidn/1.25 librtmp/2.3

c = pycurl.Curl()
c.setopt(pycurl.TIMEOUT_MS, 1000)
c.setopt(pycurl.URL, 'http://example.com/')
c.perform()
# ok

c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://example.com/')
c.setopt(pycurl.TIMEOUT_MS, 999)
c.perform()
# pycurl.error: (28, '')

c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://example.com/')
c.setopt(pycurl.TIMEOUT_MS, 999)
c.setopt(pycurl.NOSIGNAL, 1)
c.perform()
# ok again

有人可以解释为什么不到 1 秒的超时失败并且没有信号让它再次工作吗?

【问题讨论】:

    标签: python curl pycurl


    【解决方案1】:

    使用标准名称解析器时,不允许使用libcurl APItimeout_ms

    CURLOPT_TIMEOUT_MS

    CURLOPT_TIMEOUT 的替代方案,但需要毫秒数 反而。如果构建 libcurl 以使用标准系统名称解析器, 该部分传输仍将使用整秒分辨率 超时,允许的最小超时为一秒。

    【讨论】:

      【解决方案2】:

      我认为这是因为 CURL 执行的某些库调用(例如 DNS 查找)不支持超时。因此,中断它们的唯一方法是设置信号。

      【讨论】:

      • 我看到一些参考说当超时
      • 我刚刚尝试使用 TIMEOUT_MS == 500 的 curl,它在 500 毫秒后正确超时。
      • 您使用哪个名称解析器,系统标准/c-ares/线程?如果您使用系统标准,您可以在 gist 中发布您的代码吗?顺便说一句,添加了参考。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多