Mam skrypt wielowątkowy, który czasami zawiesza się, gdy łączy się z serwerem, ale serwer nie odsyła niczego. Netstat pokazuje podłączone gniazdo tcp. Zdarza się to, nawet jeśli ustawiono opcję TIMEOUT. Limit czasu działa dobrze w niehartowanym skrypcie. Oto przykładowy kod.pycurl/curl nie następuje po opcji 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()
Każda pomoc będzie bardzo ceniona! próbowali rozwiązać ten problem już od kilku tygodni.
edytuj: Lista URL zawiera około 10 adresów URL. Nie ma znaczenia, ile tam jest.
edit2: Właśnie przetestowałem ten kod poniżej. Użyłem skryptu php, który śpi przez 100 sekund.
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 w tym kodzie wydaje się być ustawiony prawidłowo. Sądzę więc, że ma to coś wspólnego z liczbą adresów URL? GIL?
Edit3:
myślę, że może to mieć związek z libcurl sama spowodować czasami kiedy sprawdzić libcurl skrypt jest wciąż podłączony do serwera całymi godzinami. Jeśli pycurl został prawidłowo ustawiony na czas, to gniazdo byłoby zamknięte.
ile adresów URL w urllist gdy występuje ten problem? czy nadal ma miejsce tylko z jednym (lub kilkoma) adresami URL/wątkami? –
jeśli uruchomisz wiele wątków przy użyciu twojego kodu "edit2", czy każdy timeout jest prawidłowy? –
Tak, działają dobrze. Wypróbowałem go z kilkoma setkami zarodków i wszystko skończyło się poprawnie. – Incognito