मेरे पास एक बहु-थ्रेडेड स्क्रिप्ट है जो कभी-कभी किसी सर्वर से कनेक्ट होने पर फ्रीज होती है लेकिन सर्वर कुछ भी वापस नहीं भेजता है। नेटस्टैट एक जुड़ा हुआ टीसीपी सॉकेट दिखाता है। यह तब भी होता है जब मेरे पास टाइमआउट सेट हो। टाइमआउट एक unthreaded स्क्रिप्ट में ठीक काम करता है। यहां कुछ नमूना कोड है।pycurl/curl CURLOPT_TIMEOUT विकल्प का पालन नहीं कर रहा है
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()
किसी भी मदद की सराहना की जाएगी! कुछ हफ्तों के लिए इसे हल करने की कोशिश कर रहा है।
संपादित करें: यूआरएलिस्ट के पास लगभग 10 यूआरएल हैं। यह कोई फर्क नहीं पड़ता कि कितने हैं।
संपादन 2: मैंने अभी इस कोड का परीक्षण नीचे किया है। मैंने एक PHP स्क्रिप्ट का उपयोग किया जो 100 सेकंड तक सोता है।
import threading
import pycurl
def testf():
c = pycurl.Curl()
c.setopt(pycurl.CONNECTTIMEOUT, 3)
c.setopt(pycurl.TIMEOUT, 6)
c.setopt(pycurl.NOSIGNAL, 1)
c.setopt(pycurl.URL, 'http://xxx.xxx.xxx.xxx/test.php')
c.setopt(pycurl.HTTPGET, 1)
c.perform()
t = threading.Thread(target=testf)
t.start()
t.join()
उस कोड में Pycurl ठीक समय पर लगता है। तो मुझे लगता है कि इसमें यूआरएल की संख्या के साथ कुछ करना है? जीआईएल?
edit3:
मुझे लगता है कि यह libcurl ही कभी कभी के कारण जब मैं जाँच स्क्रिप्ट libcurl अभी भी अंत पर घंटे के लिए एक सर्वर से कनेक्ट है के साथ क्या करना पड़ सकता है। यदि pycurl ठीक से समय समाप्त हो रहा था तो सॉकेट बंद कर दिया गया होगा।
कितने यूआरएल urllist में आती है जब यह समस्या तब होती है? क्या यह अभी भी केवल एक (या कुछ) यूआरएल/धागे के साथ होता है? –
यदि आप अपने 'edit2' कोड का उपयोग करके एकाधिक थ्रेड शुरू करते हैं, तो क्या वे प्रत्येक टाइमआउट सही तरीके से करते हैं? –
हाँ वे ठीक काम करते हैं। इसे दो सौ पंजे वाले थ्रेड के साथ बाहर निकाला और सभी ठीक से बाहर निकल गए। – Incognito