2016-10-01 2 views
1

각각의 반복을 각 스레드마다 (두 개의 루프마다) 만들어야합니다.파이썬에서 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 값을 생성하고 큐에서 큐 2 루프 읽어 값을 추가하고이 같은 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' 라이브러리는 스레드 기반이 아닙니다. 멀티 스레딩이 아니며 중요한 차이가 있습니다 (암시 적으로 하나의 상태를 공유하지 않음). '스레딩 '은 멀티 쓰레딩입니다. 단지 GIL에 제한이 있습니다. 블로킹 작업을 할 때 또는 집중적 인 CPU 작업 중에 GIL을 릴리스하는 타사 확장 패키지 (예 : numpy)를 사용할 때만 진정한 병렬 처리가 가능합니다. – ShadowRanger

관련 문제