2013-05-02 44 views
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使其再次工作?pycurl nosignal&timeout <= 999ms

回答

1

按照libcurl API,timeout_ms <使用標準名稱解析器時不允許爲1000。

CURLOPT_TIMEOUT_MS

的替代方法CURLOPT_TIMEOUT但需要毫秒 的數目代替。如果構建libcurl以使用標準系統名稱解析器,則該傳輸的該部分將仍然使用全秒分辨率用於 超時,允許的最小超時時間爲1秒。

1

我認爲這是因爲一些庫調用CURL,例如DNS查找,不支持超時。因此,唯一能夠中斷它們的方法是設置一個信號。

+0

我看到一些參考文獻說,當超時<1s時,curl忽略超時。我稍後再檢查一次。 – 2014-03-21 10:42:10

+0

我剛剛嘗試使用TIMEOUT_MS == 500捲曲,並在500毫秒後正確超時。 – user1202136 2014-03-24 09:57:06

+0

您使用哪個名稱解析器,系統標準/ c-ares/threaded?如果你使用系統標準,你可以發佈你的代碼嗎?參考添加,順便說一句。 – 2014-03-25 02:25:08