2017-05-17 11 views
0

単一の関数の複数のforループに対してマルチスレッドを実装する方法はありますか?私は別の機能を持っていればそれが達成できることを認識していますが、同じ機能の下に置くことは可能です。Pythonの単一の関数で複数のforループを並列に実行する方法

def sqImport(): 
    for i in (0,50): 
     do something specific to 0-49 
    for i in (50,100): 
     do something specific to 50-99 
    for i in (100,150): 
     do something specific to 100-149 

3つの別々の機能は、ループの異なる3用があるならば、私たちが行うことができます:たとえば

threadA = Thread(target = loopA) 
threadB = Thread(target = loopB) 
threadC = Thread(target = loopC) 
threadA.run() 
threadB.run() 
threadC.run() 
# Do work indepedent of loopA and loopB 
threadA.join() 
threadB.join() 
threadC.join() 

しかし、単一の関数の下でこれを達成する方法はありますか?

+0

を可能にする機能を変更していますか? – exilit

+0

多分[multiprocessing.pool.Pool](https://docs.python.org/3.6/library/multiprocessing.html#multiprocessing.pool.Pool)があなたを鼓舞します。 – handle

+0

これを達成するにはnode.jsを試してください –

答えて

0

実行中のスレッド間で均等にタスクを分割するmultiprocessing.ThreadPoolを使用できます。 Threading pool similar to the multiprocessing Pool?に従ってください。

並列実行を本当に探しているのであれば、スレッドはPython GIL(Global Interpreted Lock)に直面するためプロセスに進んでください。

+0

私のケース@Hitulではどうすれば使用できますか? – Austin

1

まず、生産システムで使用する場合は、実際にはmultiprocessing.ThreadPoolをご覧ください。私が以下で説明するのは、単なる可能性のある回避策です(テストの目的で使用すると簡単かもしれません)。

あなたが関数にIDを渡すと、あなたはそのように取るどのループを決定することを使用することができます。run()は別のスレッドを起動するが、中に実行されませんので、私はstart()代わりのrun()を使用

from threading import Thread 

def sqImport(tId): 
    if tId == 0: 
     for i in range(0,50): 
      print i 
    elif tId == 1: 
     for i in range(50,100): 
      print i 
    elif tId == 2: 
     for i in range(100,150): 
      print i 

threadA = Thread(target = sqImport, args=[0]) 
threadB = Thread(target = sqImport, args=[1]) 
threadC = Thread(target = sqImport, args=[2]) 
threadA.start() 
threadB.start() 
threadC.start() 
# Do work indepedent of loopA and loopB 
threadA.join() 
threadB.join() 
threadC.join() 

注意を現在のスレッドコンテキストさらに、for i in range(x,y)ループでfor i in (x, y)ループを変更しました。なぜなら、範囲を超えて反復したいというタプル(xとyだけを反復する)だからです。


multiprocessingを使用して、代替ソリューションは、次のようになります。

from multiprocessing.dummy import Pool as ThreadPool 

# The worker function 
def sqImport(data): 
    for i in data: 
     print i 


# The three ranges for the three different threads 
ranges = [ 
    range(0, 50), 
    range(50, 100), 
    range(100, 150) 
    ] 

# Create a threadpool with 3 threads 
pool = ThreadPool(3) 
# Run sqImport() on all ranges 
pool.map(sqImport, ranges) 

pool.close() 
pool.join() 
+0

ありがとう@exilit。それを試してチェックします。 – Austin

+0

@Austin ThreadPoolを使用して解決策を追加しました – exilit

+0

@ exilit、私は異なるforループのために異なる接続を印刷しています。 ex:print 'port1'、 'port2'、 'port3'の場合1番目の範囲では、それぞれ 'port1'と 'port1'が必要です。それがうまくいくのではないかと思う。 – Austin

関連する問題