pycurl нет сигнала и тайм-аут ‹= 999 мс

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 снова заработал?


person jifeng.yin    schedule 02.05.2013    source источник


Ответы (2)


Я предполагаю, что это связано с тем, что некоторые библиотечные вызовы, которые делает CURL, например, поиск DNS, не поддерживают тайм-ауты. Поэтому единственный способ прервать их — это настроить сигнал.

person user1202136    schedule 21.03.2014
comment
Я видел ссылку, в которой говорится, что завиток просто игнорирует тайм-аут, когда тайм-аут ‹ 1 с. Я проверю это позже. - person jifeng.yin; 21.03.2014
comment
Я только что попытался использовать curl с TIMEOUT_MS == 500, и время ожидания истекло через 500 мс. - person user1202136; 24.03.2014
comment
какой преобразователь имен вы используете, стандартный системный / c-ares / threaded? Можете ли вы опубликовать свой код в gist, если вы используете системный стандарт? Ссылка добавлена, кстати. - person jifeng.yin; 25.03.2014

В соответствии с libcurl API, timeout_ms ‹ 1000 не допускается при использовании стандартного преобразователя имен.

CURLOPT_TIMEOUT_MS

Альтернатива CURLOPT_TIMEOUT, но вместо этого принимает количество миллисекунд. Если libcurl построен для использования стандартного преобразователя системных имен, эта часть передачи по-прежнему будет использовать разрешение в полные секунды для тайм-аутов с минимальным допустимым тайм-аутом в одну секунду.

person jifeng.yin    schedule 25.03.2014