Napisałem prosty skrypt, który używa wątków do pobierania danych z usługi.Wystąpił błąd wyjątku "Wyjątek w wątku Wątek-13 (najprawdopodobniej wywołany podczas zamykania interpretera)"
__author__ = 'Igor'
import requests
import time
from multiprocessing.dummy import Pool as ThreadPool
ip_list = []
good_ip_list = []
bad_ip_list = []
progress = 0
with open('/tmp/ip.txt') as f:
ip_list = f.read().split()
def process_request(ip):
global progress
progress += 1
if progress % 10000 == 0:
print 'Processed ip:', progress, '...'
r = requests.get('http://*****/?ip='+ip, timeout=None)
if r.status_code == 200:
good_ip_list.append(ip)
elif r.status_code == 400:
bad_ip_list.append(ip)
else:
print 'Unknown http code received, aborting'
exit(1)
pool = ThreadPool(16)
try:
pool.map(process_request, ip_list)
except:
for name, ip_list in (('/tmp/out_good.txt', good_ip_list), ('/tmp/out_bad.txt', bad_ip_list)):
with open(name, 'w') as f:
for ip in ip_list:
print>>f, ip
Ale po niektóre wnioski przetwarzane (40k-50k) i otrzymują:
wyjątek w wątku Thread-7 (najprawdopodobniej podniesiony podczas interpretera shutdown): Traceback (najnowsza rozmowę ostatni): Process zakończony z kodem wyjścia 0
Próbowano zmienić ustawienia usługę:
<timeout>999</timeout>
<connectionlimit>600</connectionlimit>
<httpthreads>32</httpthreads>
<workerthreads>128</workerthreads>
ale nadal ten sam błąd. Czy ktoś może mi pomóc - co jest nie tak?
'druku> > f, ip' to jest literówka? Czy jest coś jeszcze w tracebacku? –
'progress + = 1' w języku z zmiennymi danymi i przy użyciu wielu wątków bez żadnej ochrony ... Przestałem patrzeć na ten punkt;) – iced
@PatrickCollins jak zrozumiałem - problem w request.exceptions.ConnectionError raise, tried aby go złapać i kontynuować działanie pool.map, ale ten sam efekt: – Igor