2017-12-05 4 views
1

잠시 동안 Multiprocessing으로 고민 중입니다. Python입니다. 두 개의 독립적 인 함수를 동시에 실행하고 두 계산이 모두 완료 될 때까지 기다렸다가 두 함수의 출력을 계속 진행하려고합니다.다중 처리 2 가지 기능 python3

# Function A: 
def jobA(num): 
    result=num*2 
    return result 

# Fuction B:   
def jobB(num): 
    result=num^3 
    return result 

# Parallel process function: 

{resultA,resultB}=runInParallel(jobA(num),jobB(num)) 

다중 처리의 다른 예제를 찾았지만 하나의 기능 만 사용하거나 출력을 반환하지 않았습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니다. 많은 감사합니다!

+0

I/O 바인딩 또는 프로세서 바인딩 기능이 있습니까? – wwii

+0

'Pool.apply_async'을 사용해 보셨습니까? – georgexsh

+0

두 함수는 웹 사이트의 데이터를 스크린 캡쳐하므로 I/O 경계입니다. –

답변

1

(풀의 일부가 아닌) 수동으로 프로세스를 생성하고 multiprocessing.Queue을 통해 주 프로세스에 반환 값을 보내는 것이 좋습니다. 이러한 대기열은 안전하고 비교적 효율적인 방식으로 거의 모든 Python 객체를 공유 할 수 있습니다.

게시 한 작업을 사용한 예입니다.

Result of job 0 is: 20 
Result of job 1 is: 1 

을하지만 당신은 당신이이 값을 사용하고자하십니까 어떤 처리 과정의 수 :

def jobA(num, q): 
    q.put(num * 2) 

def jobB(num, q): 
    q.put(num^3) 

import multiprocessing as mp 
q = mp.Queue() 
jobs = (jobA, jobB) 
args = ((10, q), (2, q)) 
for job, arg in zip(jobs, args): 
    mp.Process(target=job, args=arg).start() 

for i in range(len(jobs)): 
    print('Result of job {} is: {}'.format(i, q.get())) 

이 출력합니다.

+0

각 기능이 대기열에 넣는 값/객체에는 해당 위치에 대한 정보가 들어 있어야합니다 그래서 올바르게 사용될 수 있습니다 - 아마도 튜플'(func_name, return_value)'와 같을 것입니다. '... 두 계산이 모두 끝날 때까지 기다려라. : 당신의 예제에서 마지막 for 루프를 실행하기 전에'is_alive '중에 각 프로세스 나 루프를'join'하고 싶을 것이다. – wwii

+0

@wwii 원할 경우, 모든 데이터의 "출처"에 대한 정보를 추가 할 수 있습니다. 그러나 queue가 thread/process-safe이고'get()'을 호출하면 새로운 객체가 사용 가능할 때까지 차단되므로'join()'을 호출 할 필요가 없습니다. – bnaecker

+0

이 작업은'apply_async'와 동일하지 않습니까? – georgexsh