2016-10-01 164 views
1

我需要在不同的线程中进行每次迭代(对于这两个循环中的每一个)。如何在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

如果你想真正的多线程(其中“穿透”库不这样做!)使用'multiprocessing'库。 introduction section in the docs就是一个很好的例子。

+1

'多处理'库不是基于线程的;它不是多线程,并且存在显着差异(对于其中一个没有隐式共享状态)。 'threading'是多线程的,它只是GIL的限制,这意味着在进行阻塞工作或使用第三方扩展包(例如'numpy')时,只有在密集型CPU工作期间释放GIL才能获得真正的并行性。 – ShadowRanger