2016-10-01 6 views
1

(それぞれの2つのループごとに)別のスレッドで反復を行う必要があります。Pythonで2つのループを並列化する方法

var = 5 
a = -7 
b = 7 
for i in range(var): 
    for j in range(a, b): 
     print(i, " ", j) 

どのようにすればいいですか?

UPD:

var = 5 
a = -7 
b = 7 
max = 0 
for i in range(var): 
    for j in range(a, b): 
     print(i, " ", j) 
     if i+j>max: 
      max=i+j 
print(max) 

答えて

1

第二のループは最初のループで生産されたデータに依存しているので、あなたは別のスレッドでこれら二つのループを実行することはできません。

一つの方法は、このような別のスレッドで最初のループの各反復を実行することである。

from threading import Thread 
var = 5 
a = -7 
b = 7 

def inner_loop(i): 
    for j in range(a, b): 
     print(i, " ", j) 

for i in range(var): 
    Thread(target=inner_loop, args=[i]).start() 

別の方法は、プロデューサ、コンシューマパターンです。最初のループはi値を生成し、キューに追加し、第二のループは、キューから値を読み取ると、このようjと印刷ijを生成する:あなたは真(マルチスレッドれた「スレッド」ライブラリを使用する場合は

from threading import Thread 

var = 5 
a = -7 
b = 7 

queue = [] 
finished = False 

def inner_loop(): 
    while not finished or len(queue) > 0: 
     if len(queue) == 0: 
      continue 
     i = queue.pop() 
     for j in range(a, b): 
      print(i, " ", j) 

def first_loop(): 
    for i in range(var): 
     queue.append(i) 
    finished = True 

Thread(target=inner_loop).start() 
Thread(target=first_loop).start() 
1

)マルチプロセッシングライブラリを使用してください。 introduction section in the docsには良い例があります。

+1

'multiprocessing'ライブラリはスレッドベースではありません。マルチスレッドではなく、大きな違いがあります(暗黙的に共有されている状態ではありません)。 'threading'はマルチスレッド化されていますが、GILが制限されているだけなので、ブロッキング作業や集中的なCPU作業中にGILをリリースするサードパーティの拡張パッケージ(例えばnumpy)を使用すると真の並列性が得られます。 – ShadowRanger

関連する問題