2
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 秒的超时失败并且 nosignal 让它再次工作吗?

4

2 回答 2

1

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

于 2014-03-21T09:38:00.920 回答
1

根据libcurl APItimeout_ms使用标准名称解析器时不允许 < 1000。

CURLOPT_TIMEOUT_MS

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

于 2014-03-25T02:12:31.020 回答