2017-05-19 8 views
1

class_fオブジェクトの数を同時に制限するには、次のコードにします。すなわち、同時に動作するスレッドの数を制限する。どうやってやるの ?作成されるスレッドオブジェクトの数を制限する方法は?

#!/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

どのような方法、何にしようとしたとき起こるべきで、それを制限します制限を超える別の 'class_f'スレッドオブジェクトを作成しますか? – martineau

答えて

1

境界セマフォを使用することをお勧めします。スレッドが仕事をして開始する前に、あなたの__init__コールsempahore.acquire()に続いて

maxThreads = 10 
semaphore = threading.BoundedSemaphore(maxThreads) 

: あなたはこのようにそれを実装します。スレッドが完了すると、sempahore.release()が呼び出されます。 Acquireはセマフォに格納されている数値を減分します。値が0のセマフォを取得しようとすると、セマフォが再び解放されるまで待機します。 semaphoresの詳細な説明については、Fredrik LundhのThread Synchronization Mechanisms in Pythonをご覧ください。

0

ほとんどの場合、文書化されていないThreadPoolクラスをmultiprocessing.poolで使用することができます。これは、自分で作成したものと比べて、簡単にやりたいことができるからです。ここで

は(私もPEP 8 - Style Guide for Python Code勧告に準拠するように変更した)あなたの質問内のコードに適用する方法は次のとおりです。

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() 
関連する問題