2015-03-13 10 views
6

मैंने एक साधारण लिपि लिखी, जो सेवा से डेटा पुनर्प्राप्त करने के लिए धागे का उपयोग कर रहा था।गॉट अपवाद त्रुटि "थ्रेड थ्रेड -13 में अपवाद (दुभाषिया शट डाउन के दौरान सबसे अधिक संभावना)"

__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 

लेकिन कुछ अनुरोध संसाधित (40k-50k) के बाद मैं प्राप्त करते हैं:

धागा धागा -7 में अपवाद (सबसे अधिक संभावना दुभाषिया शटडाउन के दौरान उठाया): Traceback (सबसे हाल कॉल पिछले): प्रक्रिया

 <timeout>999</timeout> 
     <connectionlimit>600</connectionlimit> 
     <httpthreads>32</httpthreads> 
     <workerthreads>128</workerthreads> 

लेकिन अब भी वही त्रुटि: बाहर निकलने के कोड 0

सेवा सेटिंग में बदलाव करने की कोशिश की के साथ समाप्त हो गया। क्या कोई मेरी मदद कर सकता है - क्या गलत है?

+0

'प्रिंट> > एफ, आईपी' यह एक टाइपो है? क्या ट्रेसबैक में कुछ और है? –

+1

'परिवर्तनीय डेटा के साथ भाषा में प्रगति + = 1' और किसी भी सुरक्षा w/o किसी भी सुरक्षा का उपयोग कर ... मैं उस बिंदु को देखना बंद कर दिया;) – iced

+1

@ पैट्रिक कोलिन्स जैसा कि मैंने समझा - अनुरोधों में समस्या। Exceptions.ConnectionError raise, कोशिश की इसे पकड़ने और पूल.मैप जारी रखने के लिए, लेकिन उसी प्रभाव – Igor

उत्तर

4

सभी को धन्यवाद, जिन्होंने इस समस्या को हल करने में मेरी मदद की। पूरे कोड दुबारा लिखा और अब यह पूरी तरह से काम करता है:

__author__ = 'kulakov' 
import requests 
import time 
from multiprocessing.dummy import Pool as ThreadPool 

ip_list = [] 
good_ip_list = [] 
bad_ip_list = [] 

with open('/tmp/ip.txt') as f: 
    ip_list = f.read().split() 

s = requests.Session() 
def process_request(ip): 
    r = s.get('http://*****/?ip='+ip, timeout=None) 
    if r.status_code == 200: 
     # good_ip_list.append(ip) 
     return (ip, True) 
    elif r.status_code == 400: 
     # bad_ip_list.append(ip) 
     return (ip, False) 
    else: 
     print 'Unknown http code received, aborting' 
     exit(1) 

pool = ThreadPool(16) 
for ip, isOk in pool.imap(process_request, ip_list): 
    if isOk: 
     good_ip_list.append(ip) 
    else: 
     bad_ip_list.append(ip) 
pool.close() 
pool.join() 

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 

कुछ नए उपयोगी जानकारी:

1) यह वास्तव में बुरा विचार एक समारोह process_request में अलग धागे में डेटा लिखने के लिए किया गया था, अब यह बयान (सच रिटर्न \ झूठा) और आईपी।

2) keep alive पूरी तरह से requests द्वारा समर्थित है, डिफ़ॉल्ट रूप से, लेकिन आप इसे उपयोग करना चाहते हैं, आप एक वस्तु Session के कहने बनाना होगा, और यह केवल करने के लिए get विधि लागू होते हैं:

s = requests.Session() 
r = s.get('http://*****/?ip='+ip, timeout=None) 
1

यह:

good_ip_list = [] 
bad_ip_list = [] 

अजगर बहु ​​के साथ मिश्रण करने के लिए सुरक्षित नहीं है। सही तरीका प्रत्येक कॉल से process_request पर एक टुपल (या कुछ) वापस करना है और फिर अंत में उन्हें समेकित करना है। progress को कई प्रक्रियाओं से समवर्ती रूप से संशोधित करना भी सुरक्षित नहीं है। मैं सकारात्मक नहीं हूं कि आपकी त्रुटि क्या है, लेकिन मुझे लगता है कि यह कुछ सिंक्रनाइज़ेशन समस्या है जो पूरी तरह से पाइथन को मार रही है।

साझा स्थिति को हटाएं और पुनः प्रयास करें।

+1

धन्यवाद, @Patrick कोलिन्स मुझे लगता है कि आप सही इस सुझाव के साथ कर रहे हैं: "मुझे यकीन है यह कुछ तुल्यकालन समस्या यह है कि एक पूरे के रूप अजगर की मौत हो गई है" आप थोड़ा और अधिक, कृपया इस बात की व्याख्या कर सकते: "निकालें साझा राज्य और पुनः प्रयास करें। " इनपुट डेटा के रूप में मेरे पास एक function 'process_request' और एक सूची 'ip_list' है। तो चक्र में नहीं, इस 2 ऑब्जेक्ट्स को मैप करने का सही तरीका क्या है (जैसा कि मैंने चक्र के साथ प्रयास किया है, यह पूरी तरह से काम करता है, लेकिन बहुत धीमा) लेकिन विभिन्न धागे में। धन्यवाद। – Igor

+1

@ इगोर 'good_ip_list, bad_ip_list' और 'process_request' के अंदर' प्रगति' के संदर्भों को लेता है। 'Process_request' के अंदर बनाई गई वस्तुओं को छोड़कर 'process_request' के अंदर कुछ भी संशोधित न करें। इसके बजाय, आईपी अच्छा था या नहीं, इस पर निर्भर करता है कि कॉल में 'सत्य' या 'झूठी' वापस लौटने जैसा कुछ करें। –

संबंधित मुद्दे