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() 
  • Python-Threading: Gedächtnismodell und Sichtbarkeit
  • Brauchen Sie Hilfe mit Python Threading / Warteschlange
  • Wie beendet man die gesamte Anwendung aus einem Python-Thread?
  • Python-Multi-Threading-Dateiverarbeitung
  • Python3 Webserver kommunizieren zwischen Threads für IRC bot
  • Multiprocessing scikit-lernen
  • Python: Understanding Threading Module
  • Python Threading String Argumente
  • Öffnen eines Python-Threads in einem neuen Konsolenfenster
  • Thread sichere Locale Techniken
  • Python: Hilfe bei UnboundLocalError: lokale Variable referenziert vor der Zuweisung
  • Python ist die beste Programmiersprache der Welt.