2016-04-30 15 views
2

THINGS変数には101個のものが格納されています。 コードは101個のスレッドを宣言し、すべて同時に同時に瞬時に実行します。スレッドの数を制限する方法

私達はちょうど12

最初のみ12スレッドの処理にその12個のものを選ぶ必要があるためにアクティブなスレッドの数を制限することができる場合、私は疑問に思います。残りのスレッドは、最初の12人が作業を終了するのを待つ必要があります。最初の12個のスレッドがすべて完了すると、次の12個のスレッドが処理する次の12個のスレッドを取得します。それで1つ。

可能でしょうか?

import Queue 
import threading, time 

class MyThread(threading.Thread): 
    def __init__(self, theQueue=None): 
     threading.Thread.__init__(self)   
     self.theQueue=theQueue 

    def run(self): 
     thing=self.theQueue.get() 
     self.process(thing) 
     self.theQueue.task_done() 

    def process(self, thing): 
     time.sleep(1) 
     print 'processing %s'%thing.name 

queue=Queue.Queue() 
THINGS = ['Thing%02d'%i for i in range(101)] 

THREADS=[] 
for thing in THINGS: 
    thread=MyThread(theQueue=queue) 
    thread.name = thing 
    THREADS.append(thread) 
    thread.start() 

for thread in THREADS:  
    queue.put(thread) 
+2

の可能性のある重複[一度に実行中のスレッドの最大数を制限するための正しい方法を?](http://stackoverflow.com/questions/19369724/the-right-way-to-limit-maximum-number -of-threads-running-at-once) – Morishiri

+1

プールのように見えます。https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers – Olegp

+0

私たちがアクティブなスレッドの数をちょうど12分に制限することができます。 12のスレッドを作成します。もう作ってはいけない。それらのいずれかを終了させないでください。 –

答えて

3

以下の作業ソリューションが掲載されています。 基本的な考え方は、使用可能なCPUと同じ数だけスレッドインスタンスを宣言することです。次に、「タスク」(ここでは「もの」)をキューに追加します。 タスクがキューに追加されると直ちに、前の手順で宣言したThreadインスタンスの1つが直ちに選択されます。

重要:このメカニズムを機能させるには、MyThread.run()メソッドをwhileループ内で実行する必要があります。それ以外の場合、MyThreadインスタンスは最初のタスクが完了するとすぐに終了します。 whileループは、キュー内のタスクが残っていない場合は、自身を終了します。それが物語の終わりです。

import Queue 
import threading, time 

class MyThread(threading.Thread): 
    def __init__(self, theQueue=None): 
     threading.Thread.__init__(self)   
     self.theQueue=theQueue 

    def run(self): 
     while True: 
      thing=self.theQueue.get() 
      self.process(thing) 
      self.theQueue.task_done() 

    def process(self, thing): 
     time.sleep(1) 
     print 'processing %s'%thing 

queue=Queue.Queue() 
THINGS = ['Thing%02d'%i for i in range(101)] 
AVAILABLE_CPUS=3 

for OneOf in range(AVAILABLE_CPUS): 
    thread=MyThread(theQueue=queue) 
    thread.start() # thread started. But since there are no tasks in Queue yet it is just waiting. 

for thing in THINGS:  
    queue.put(thing) # as soon as task in added here one of available Threads picks it up 
+2

鮮やかな答え!非常に役立ちます。私のためにはうまくいかなかった唯一のことは、コードが終了しないので、 'while True'ではなく' theQueue.empty(): 'を使用しませんでした。この作業を行うために、 'for'ループを' THIINGS'で実行してから 'for'ループを' AVAILABLE_CPUS'で実行してください。そうでなければ 'myQueue'が空になるのですぐに終了します。 – Andras

関連する問題