0

python3을 사용하여 병렬로 프로세스를 실행하고 싶습니다. 내가 가지고있는 코드는 다른 코드 다음에 한 가지를 실행하고있다. 병렬로 만드는 방법에 대한 아이디어가 있습니까?다중 프로세스가 python3에서 병렬로 작동하지 않습니다.

from multiprocessing import Process 

def work(x, outfile): 
    for i in range(0,200000): 
     print(x, i,'hello world', outfile) 

if __name__ == '__main__': 
    NUM_THREADS = 4 
    for x in range(NUM_THREADS): 
     try: 
      outfile = "tmp"+str(x) 
      p = Process(target=work, args =(x, outfile)) 
      p.start() 
      p.join() 
     except: 
      raise 
      print("Error: unable to start thread", x) 
+1

'p.join을()' 프로세스가 완료 될 때까지 대기합니다. 루프에서 빠져 나오기를 원합니다. – syntonym

+0

'print' 전에'raise'를 쓰면 결코'print'되지 않을 것입니다. (re-'reise'는 다른 코드가 잡힐 때까지 후속 코드를 우회하거나'__main__'에서 완전히 빠져 나올 때까지). 'print'가 중요하다면 그것들을 바꿀 수 있습니다. – ShadowRanger

답변

-1

프로세스를 데몬으로 실행해야합니다. 프로세스가 완료 될 때까지 p.daemon = Truep.start() 전에

p.join() 대기를 추가

보십시오. 당신은 그것도 제거해야합니다.

+1

이것은 [python documentation] (https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.daemon)을 통해 거짓입니다.'[데몬 프로세스]는 유닉스 데몬이나 서비스가 아니며, '부모 프로세스가 종료했다면 종료 될 정상적인 프로세스입니다. ' – syntonym

+0

'p.daemon = True'를 추가하려고했는데 차이가없는 것 같습니다. 'p.join()'을 없애면 함수가 더 나 빠지고 함수는 부분적으로 한 번만 실행되고 중단되고 중단됩니다. – aLbAc

0

동일한 루프의 동일한 블록에서 시작하고 결합 할 수 없습니다. 조인은 현재 실행중인 스레드가 "과정"시작할 때까지 중지

if __name__ == '__main__': 
    NUM_THREADS = 4 
    process_list = [] 
    for x in range(NUM_THREADS): 
     try: 
      outfile = "tmp"+str(x) 
      p = Process(target=work, args =(x, outfile)) 
      p.start() 
      process_list.append(p) 
     except: 
      raise 
      print("Error: unable to start thread", x) 

    # wait for processes to finish 
    for process in process_list: 
     process.join() 
0

내가이 당신을 위해 관련이 있는지 확실하지 않습니다 완료해야 함을 의미하지만 일반적으로 멀티 프로세스 모듈과 고투하고, 대신에 더 큰 성공을 거두었 pathos 모듈 (Linux 및 Mac의 경우 적어도 Windows가 아님). 나는 이것을 멀티 코어 사용을 위해 설정했지만 threados/core split 사용을 위해 pathos 모듈을 점검한다. 이 패키지를 작성하기위한 마이크 McKerns에

신용, 그것은 파이썬에서 멀티 코어 사용하기에 훨씬 쉽게 내 인생을 만들어

필요한 최소한의 코드, 아래 참조 :

from pathos.helpers import mp 
import numpy as np 

x=np.arange(0,200000) 
splitx=np.array_split(x,4) 
def dummy(y): 
    return(y) 

pooler=mp.Pool(4) 

for value in pooler.imap(dummy,splitx): 
    print(value) 

pooler.close() 
pooler.join() 

[ 0  1  2 ..., 49997 49998 49999] 
[50000 50001 50002 ..., 99997 99998 99999] 
[100000 100001 100002 ..., 149997 149998 149999] 
[150000 150001 150002 ..., 199997 199998 199999] 
+0

이 "도우미"모듈에는 기존의'multiprocessing.Pool' API에 맞지 않는 것이 없습니다. 요점이 뭐야? – ShadowRanger

+0

흠, 솔직히 여기서 전문가는 아니지만, 딜 모듈을 포함함으로써 멀티 프로세스 모듈에서 오브젝트 유형을 산세로 처리하는 문제를 극복 할 수 있습니다. (걱정할 필요가없는 멍청한 일은 없습니다.) (https://stackoverflow.com/ 질문/19984152/what-can-multiprocessing-and-dill-do-together) – srhoades10