2017-05-19 8 views
1

Ich möchte im folgenden Code die Anzahl der class_f Objekte gleichzeitig begrenzen. d. h. Begrenzen Sie die Anzahl der Threads, die gleichzeitig arbeiten. Wie kann ich das machen ?Wie kann die Anzahl der erstellten Thread-Objekte begrenzt werden?

#!/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() 
+0

Grenze in welcher Weise-was passieren soll, wenn ein Versuch unternommen wird, ein anderes 'class_f' Thread-Objekt erstellen, das den Grenzwert überschreiten würde? – martineau

Antwort

1

Ich würde empfehlen, einen begrenzten Semaphor zu verwenden. Sie würde es so implementieren:

maxThreads = 10 
semaphore = threading.BoundedSemaphore(maxThreads) 

Dann in Ihrem __init__ Anruf sempahore.acquire(), bevor der Thread Arbeit beginnt zu tun. Wenn der Thread fertig ist, rufen Sie sempahore.release(). Acquire dekrementiert die im Semaphor gespeicherte Nummer. Wenn Sie versuchen, einen Semaphor mit einem Wert von Null zu erhalten, wird gewartet, bis der Semaphor wieder freigegeben wird. Werfen Sie einen Blick auf Thread Synchronization Mechanisms in Python von Fredrik Lundh für eine ausführlichere Erklärung der Verwendung von semaphores.

0

Sie könnten die weitgehend undokumentierte ThreadPool Klasse in multiprocessing.pool verwenden, weil sie macht, was Sie wollen, einfach zu tun - im Vergleich zu Ihnen, Ihr eigenes zu schreiben (was wie das klingt, was Sie brauchen).

Hier ist, wie es in Ihrer Frage an den Code anwenden (was ich habe auch mit den PEP 8 - Style Guide for Python Code Empfehlungen entsprechen geändert):

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() 
Verwandte Themen