2017-12-21 43 views
0

파이썬에서 병렬 처리를 배우고 있으며 다음 프로그램의 실행 흐름과 관련하여 몇 가지 구체적인 의문점이 있습니다. 이 프로그램에서는 프로세스에 따라 목록을 두 부분으로 나눕니다. 내 목표는 하나의 프로세스가 목록의 한 부분을 차지하고 다른 프로세스가 다른 부분을 차지하는 곳에서 두 번 병렬로 add 함수를 실행하는 것입니다.프로세스 흐름을 파이썬에서 병렬 처리

import multiprocessing as mp 
x = [1,2,3,4] 

print('hello') 
def add(flag, q_f): 
    global x 
    if flag == 1: 
     dl = x[0:2] 
    elif flag == 2: 
     dl = x[2:4] 
    else: 
     dl = x 
    x = [i+2 for i in dl] 
    print('flag = %d'%flag) 
    print('1') 
    print('2') 
    print(x) 
    q_f.put(x) 

print('Above main') 

if __name__ == '__main__': 
    ctx = mp.get_context('spawn') 
    print('inside main') 
    q = ctx.Queue() 
    jobs = [] 
    for i in range(2): 
     p = mp.Process(target = add, args = (i+1, q)) 
     jobs.append(p) 
    for j in jobs: 
     j.start() 
    for j in jobs: 
     j.join() 
    print('completed') 
    print(q.get()) 
    print(q.get()) 

print('outside main') 

내가 가진 출력은

hello 
Above main 
outside main 
flag = 1 
1 
2 
[3, 4] 
hello 
Above main 
outside main 
flag = 2 
1 
2 
[5, 6] 
hello 
Above main 
inside main 
completed 
[3, 4] 
[5, 6] 
outside main 

내 질문이 출력에서 ​​

1

을)하다, 우리는 다른, 하나 개의 프로세스가 먼저 실행지고 있음을 볼 수 있습니다. 프로그램이 병렬 처리를 위해 실제로 여러 개의 프로세서를 사용하고 있습니까? 그렇지 않다면 어떻게 병렬 처리 할 수 ​​있습니까? 평행하게 처리했다면, print ('1') print ('2')는 무작위로 실행되어야합니다.

2) 어떤 프로세서가 프로그램을 실행하고 있는지 프로그래밍 방식으로 확인할 수 있습니까?

3) 메인 (안녕하세요, 메인 위, 메인 외부)의 인쇄 문이 3 번 실행되는 이유는 무엇입니까?

4) 프로그램 실행의 흐름은 무엇입니까?

+0

1) 독립적으로 실행 (첫번째 과정은 확실하지 않음) 2) 두 번째 시작하기 전에 완료됩니다. 3) 코드를 실행할 때 인쇄 명령문이 추가로 실행되지 않습니다. –

+0

@JohnAnderson이 동작은 Windows 관련 –

답변

1

1) add()의 실행이 너무 빨라서 두 번째 프로세스가 시작될 때 첫 번째 실행이 이미 끝났을 수 있습니다.

2) 공정은 일반적으로 특정 CPU에 할당 있지만

3) 각 모듈이 다시 실행해야합니다 처리 시작을 위해 Windows를 사용하는 경우 사이에 점프하지 않습니다. 이러한 실행을 위해 __name__'main' 아니라이 print의 같은 (if 등의 외부) 모든 무조건 명령이 실행됩니다.

이 Windows에서 호출 될 때 필요한 모듈을 가져 와서 실행하는 데 필요한 새 파이썬 인터프리터가 시작되고 하위 프로세스를 실행하는 데 필요한 리소스가 새 인터프리터에 전달됩니다 (" "방법은 https://docs.python.org/3.6/library/multiprocessing.html#contexts-and-start-methods에 기술되어있다. (더 동기화 프로그램에 의해 수행되지 않은 경우) 모든 프로세스는 다음 그것은 당신의 코드가 너무 빨리 실행하는 수

+0

고맙습니다. – VaM999