Bir sunucuya bağlandığında bazen donuyor, ancak sunucu herhangi bir şey göndermiyorsa çok iş parçacıklı bir komut dosyası var. Netstat bağlı bir tcp soketini gösterir. Bu, TIMEOUT ayarlanmış olsa bile olur. Zaman aşımı, işlenmemiş bir komut dosyasında düzgün çalışıyor. İşte bazı örnek kod.CURLOPT_TIMEOUT seçeneğini takip etmeyen pazı/kıvrılma
def xmlscraper(url):
htmlpage = StringIO.StringIO()
rheader = StringIO.StringIO()
c = pycurl.Curl()
c.setopt(pycurl.USERAGENT, "user agent string")
c.setopt(pycurl.CONNECTTIMEOUT, 60)
c.setopt(pycurl.TIMEOUT, 120)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.WRITEFUNCTION, htmlpage.write)
c.setopt(pycurl.HEADERFUNCTION, rheader.write)
c.setopt(pycurl.HTTPHEADER, ['Expect:'])
c.setopt(pycurl.NOSIGNAL, 1)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPGET, 1)
pycurl.global_init(pycurl.GLOBAL_ALL)
for url in urllist:
t = threading.Thread(target=xmlscraper, args=(url,))
t.start()
Herhangi bir yardım çok takdir edilecektir! Bunu birkaç hafta için çözmeye çalışıyordum.
düzenleme: Urllist yaklaşık 10 url'ye sahiptir. Kaç tane olduğu önemli değil.
edit2: Sadece bu kodu aşağıda test ettim. 100 saniye boyunca uyuyan bir php betiği kullandım. Bu koddaki Pycurl, zaman aşımına uğramış gibi görünüyor. Yani sanırım URL'lerin sayısı ile ilgili bir şey var mı? GIL?
Edit3:
Ben Senaryonun libcurl hala saatlerce bir sunucuya bağlı olduğunu gösterirse kendisi bazen neden libcurl ile ilgisi olabileceğini düşünüyorum. Eğer püskül düzgün zaman aşımına uğradıysa, o zaman soket kapatılmış olur.
? Hala tek bir (veya birkaç) urls/thread ile olur mu? –
'edit2' kodunuzu kullanarak birden çok ileti dizisi başlatırsanız, her bir zaman aşımı düzgün yapar mı? –
evet iyi çalışıyorlar. Birkaç yüz yumurtlama ipliği ile denedim ve hepsi doğru şekilde zamanlandı. – Incognito