2010-11-01 15 views
14

से हटा दें मैं एक धागा जो थ्रेड फैली है। कोड इस तरह थोड़ा दिखता है;अजगर - एक धागे पर जाँच/सूची

class MyThread(Thread): 
    def run(self): 
     # Do stuff 

my_threads = [] 
while has_jobs() and len(my_threads) < 5: 
    new_thread = MyThread(next_job_details()) 
    new_thread.run() 
    my_threads.append(new_thread) 

for my_thread in my_threads 
    my_thread.join() 
    # Do stuff 

तो मेरी छद्म कोड में यहाँ मैं अगर कोई जॉब (एक डाटाबेस आदि की तरह) है देखने के लिए जाँच करें और अगर वहाँ कुछ नौकरियों है, और अगर वहाँ कम से कम 5 चल सूत्र, नया सूत्र बना सकते हैं।

तो यहां से, मैं फिर अपने धागे की जांच करता हूं और यह वह जगह है जहां मैं अटक जाता हूं, मैं .join() का उपयोग कर सकता हूं लेकिन मेरी समझ यह है कि - यह तब तक समाप्त हो जाता है जब तक यह समाप्त नहीं हो जाता है, अगर यह पहले धागा की जांच करता है कार्य प्रगति पर है, यह तो इंतजार कर रहा है जब तक यह किया है - भले ही अन्य थ्रेड समाप्त कर लें ....

तो वहाँ अगर एक धागा किया जाता है, तो इसे हटाने यदि ऐसा है तो जाँच करने के लिए एक तरीका है?

जैसे

for my_thread in my_threads: 
    if my_thread.done(): 
     # process results 
     del (my_threads[my_thread]) ?? will that work... 

उत्तर

24

चल रहा है TokenMacGuy कहते हैं, आप अगर एक धागा अभी भी चल रहा है की जाँच करने के thread.isAlive() का उपयोग करना चाहिए पता लगाने के लिए thread.isAlive() कॉल करने के लिए की जरूरत है। अपनी सूची से धागे अब नहीं चल निकालने के लिए आप एक list comprehension उपयोग कर सकते हैं:

for t in my_threads: 
    if not t.isAlive(): 
     # get results from thtead 
     t.handled = True 
my_threads = [t for t in my_threads if not t.handled] 

यह एक सूची से आइटम को हटाने इस पर पुनरावृत्ति करते हुए की समस्या से बचा जाता है। प्रलेखन पृष्ठ के निचले भाग में अच्छा उदाहरण कोड में http://docs.python.org/library/queue.html

देखो:

+0

धन्यवाद, लेकिन है कि एक परिणाम का क्या मतलब है खो दिया जा सकता है? यदि कोई धागा अब जीवित नहीं है तो मुझे परिणाम प्राप्त करने की आवश्यकता है। – Wizzard

+0

यह सच है। मैंने इसे अपने खाते में लेने के लिए संशोधित किया है। – Arlaharen

+5

पायथन 2.6+ – trim

3

आप अगर धागा अभी भी

+0

और, जब यह किया जाता है तो थ्रेड से निकालने के लिए? – Wizzard

4

बेहतर तरीका कतार वर्ग का उपयोग है

def worker(): 
    while True: 
     item = q.get() 
     do_work(item) 
     q.task_done() 

q = Queue() 
for i in range(num_worker_threads): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start() 

for item in source(): 
    q.put(item) 

q.join()  # block until all tasks are done 
+1

धन्यवाद, लेकिन मैं q.join के साथ एक ही मुद्दे में चला सकते हैं()? अगर मेरे पास 20 नौकरियां हैं जो करने की ज़रूरत है लेकिन केवल एक समय में अधिकतम 4 रन बनाना चाहते हैं। तो 3 से किया जाता है और एक तो नहीं किया है मैं इस कार्यक्रम को धीमा करने, जबकि यह है कि 1 परिणाम के लिए इंतजार कर रहा है नहीं चाहता ... – Wizzard

0

जवाब कवर किया गया है, लेकिन सादगी के लिए ...

# To filter out finished threads 
threads = [t for t in threads if t.is_alive()] 

# Same thing but for QThreads (if you are using PyQt) 
threads = [t for t in threads if t.isRunning()] 
संबंधित मुद्दे