2016-12-28 7 views
1

スレッドのパワーを示す次の2つのスニペットがあり、それぞれの実装の違いが何か不思議です。Python Threading/ThreadPoolの実装

from multiprocessing.dummy import Pool as ThreadPool 

def threadInfiniteLoop(passedNumber): 
    while 1: 
     print passedNumber 

if __name__ == '__main__': 
    packedVals={ 
     'number':[0,1,2,3,4,5,6,7,8,9] 
    } 
    pool = ThreadPool(len(packedVals['number'])) 
    pool.map(func=threadInfiniteLoop,iterable=packedVals['number']) 

import threading 

def threadLoop(numberPassed): 
    while 1: 
     print numberPassed 

if __name__ == '__main__': 
    for number in range(10): 
     t = threading.Thread(target=threadLoop, args=(number,)) 
     t.start() 

2つのスニペットとその初期化の各スレッドの違いは何ですか? 1つの利点が他のものに比べてあり、望ましい状況であれば、他のものより適用可能なものは何か?

+0

私は 'ThreadPool'ははるかに読みやすく、いつでもあなたが9000スレッドを開始していないことを確信できると思います。 –

答えて

0

永遠に実行されるスレッドを開始する場合は、それほど大きな違いはありません。

通常、スレッドプールを使用するのは、プログラムがバックグラウンドで実行するための新しい有限のタスクを継続的に作成する場合です。

スレッドの作成と破棄は比較的コストが高いため、長い間スレッドを数回スクロールしてから、それらのスレッドを何度も繰り返し使用してバックグラウンドタスクを実行するのが理にかなっています。それはスレッドプールがあなたのために行うものです。

通常、スレッドを作成する際には何も意味がありません。プールあなたが望むのは、決して終了しない単一のスレッドです。

+0

whileループで複数のスレッドを無期限に実行したい場合はどうですか? – George52098

+0

@ George52098、もしあなたが不特定多数のスレッドを起動するように頼んでいるのであれば、各スレッドが何か小さなことをしてからそれが消滅するところで、それらの小さな事柄が私が「タスク」と言ったときのものです。スレッドプールは新しいスレッドごとに新しいスレッドを作成する必要がないため、この種の作業を行うスレッドプールです。新しいタスクごとに新しいスレッドを作成するコストは、実際にタスクを実行するコストを大幅に上回ります。 –