Wie kann man die Anzahl der angelegten Thread-Objekte begrenzen?

Ich möchte im folgenden Code die Anzahl der class_f laufenden class_f Objekte begrenzen. Dh Begrenzt die Anzahl der gleichzeitig arbeitenden Fäden. Wie kann ich das machen ?

 #!/usr/bin/env python import random import time from threading import Thread list_num = [1,2,3,4,5,6,7,8,9,10] class class_f(Thread): def __init__(self,x): Thread.__init__(self) self.x = x def run(self): time.sleep(random.randint(0,1)) res = self.x * self.x print str(res)+"\n" def main(): for num in list_num: c=class_f(num) c.start() if __name__ == "__main__": main() 

2 Solutions collect form web for “Wie kann man die Anzahl der angelegten Thread-Objekte begrenzen?”

Ich würde empfehlen, eine beschränkte Semaphor zu verwenden. Sie würden es so umsetzen:

 maxThreads = 10 semaphore = threading.BoundedSemaphore(maxThreads) 

Dann in deinem __init__ call sempahore.acquire() bevor der Thread beginnt Arbeit zu machen. Wenn der Thread fertig ist, rufen Sie sempahore.release() . Erwerb dekrementiert die im Semaphor gespeicherte Zahl. Wenn Sie versuchen, ein Semaphor mit einem Wert von Null zu erwerben, wird es warten, bis das Semaphor wieder freigegeben wird. Werfen Sie einen Blick auf Thread Synchronization Mechanismen in Python von Fredrik Lundh für eine ausführlichere Erklärung der Verwendung von Semaphoren .

Du könntest die weitgehend undokumentierte ThreadPool- Klasse in multiprocessing.pool verwenden, weil es macht, was du einfach machen willst – im Vergleich zu dir, was du schreibst (was klingt wie das, was du brauchst).

Hier ist, wie man es auf den Code in Ihrer Frage anwenden (die ich auch geändert habe, um mit dem PEP 8 – Style Guide für Python Code Empfehlungen übereinzustimmen):

 from multiprocessing.pool import ThreadPool import random from threading import Lock, Thread import time MAX_THREADS = 5 threads = [] list_num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print_lock = Lock() # to prevent overlapped printing from threads class ClassF(Thread): def __init__(self, x): Thread.__init__(self) self.x = x def run(self): time.sleep(random.randint(0, 1)) res = self.x * self.x with print_lock: print str(res)+"\n" def main(): pool = ThreadPool(processes=MAX_THREADS) results = [] for num in list_num: c = ClassF(num) results.append(pool.apply_async(c.start)) # wait until all threads have finished while not(all(c.ready() for c in results)): pass if __name__ == "__main__": main() 
  • Wie kann ich ein Multithread-Programm beenden?
  • Mit Threading zu halten FTP-Control-Port lebendig
  • Python Threads laufen nicht in C ++ Application Embedded Interpreter
  • Threading in einer PyQt-Anwendung: Verwenden Sie Qt-Threads oder Python-Threads?
  • Beenden Sie ein Multi-Thread-Python-Programm
  • Key-Echo in Python im separaten Thread zeigt keinen ersten Tastendruck an
  • Wie kann ich das itertools Produktmodul "verarbeiten"?
  • Python Multithreading warten, bis alle Fäden fertig sind
  • Python PySide und Progress Bar Threading
  • Eine lange Zeit dauern, um einen Salzstapelbefehl mit Python auszuführen
  • Multiprocessing-GUI-Schemata zur Bekämpfung der "Not Responding" -Blockierung
  • Python ist die beste Programmiersprache der Welt.