2016-11-08 1 views
1

아래 코드를 사용하여 다중 처리의 프로세스 함수를 사용하여 2 개의 함수를 동시에 실행하는 데 어려움을 겪고 있습니다. 결국 내 노력은 스크립트 본문 내에서 확인 될 타이머를 실행하는 것입니다. 시간이 완료되면 본체에서 종속 된 것보다 자체 작업이 트리거됩니다. 시간이 완료되지 않으면 다음 작업으로 넘어갑니다.Python 3 동시에 여러 함수 실행

내가 빌드와 맥북 프로에서 이것을 실행 해요 : 프로세서 이름 : 인텔 코어 2 듀오 프로세서 속도 : 코어의 1 총 수 : 2

스크립트 2.66 GHz의 프로세서의 수 :

#!/usr/bin/pyton 

# MODULES 
import time 
from multiprocessing import Process 

# GLOBAL VARIABLES 
Completion = '' 

# FUNCTIONS 
def Timer(duration): 
     global Completion 
     Ticker = 0 
     while Ticker != duration: 
       Ticker = Ticker + 1 
       print(Ticker) 
       time.sleep(1) 

     Completion = '{0}TickerDone'.format(duration) 

def Wait(seconds): 
     time.sleep(seconds) 

#MAIN 
P1 = Process(target = Timer(10)) 
P1.start() 

P2 = Process(target = Wait(11)) 
P2.start() 

P1.join() 
P2.join() 

print(Completion) 

if Completion == '10TickerDone': 
     print('Good to go!\n') 
else: 
     print('Not yet!\n') 

# END 

두 기능은 제 기능의 완료 10 + 1 secondards 기다려야 의도하지만 상기 제 기능을 제외한다 무엇, 첫 번째 함수 일단 시작 10 초 타이머이며 완료되었습니다. 본질적으로, 나는 10 초 타이머를 테스트하기 위해 21 초를 기다려야 만합니다.

결과 : 첫번째 기능은 제 기능을 실행하기 전에 완료되는 경우, 두 번째 기능은 테스트 할 수 있도록 I해야 할 일

$ python Test.py 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
10TickerDone 
Good to go! 

병렬 이러한 두 가지 기능을 실행할 수있다.

어디로 잘못 가고 있습니까?

+0

주에있는 문서, 내가 스레드와 프로세스를 대체 스레딩과 같은 일을 시도했지만 같은 결과가 있습니다. – danjmwalker

+0

안녕하세요. Mark. 당신이 가지고있는 것처럼 쓰려고했지만 똑같은 결과가 나옵니다. – danjmwalker

+0

P1 = Process (target = Timer (10), args = (10,)) P1.start() P2 = 프로세스 (대상 = 대기, 인수 = (11)) P2.start – danjmwalker

답변

1

주요 문제 거기에 다른 프로세스를 시작하기 전에 직접 하위 프로세스에서 대상 funcitons을 실행하고 있지 않다는 것입니다.

당신이 좋아하는 코드를 수행 할 때 : P1 = Process(target = Timer(10)) 파이썬은 imediattely target= 부분의 왼쪽에있는 표현을 해결할 수 - 그리고 함수를 호출은, 느릅 나무 후 10 초 동안 기다린 것, 대상이 실제로있는 서브 프로세스 객체를 생성 그 함수의 반환 값 (None).

그래서, 당신은 그냥 할 경우 :

#MAIN 

P1 = Process(target=Timer, args=(10,)) 
P1.start() 

P2 = Process(target=Wait, args=(11,)) 
P2.start() 

당신이 원하는 방향으로가는 것을보고 시작합니다. 차이점을 살펴 보겠습니다. 여기서는 이름 뒤에 즉각적인 "괄호 열기"없이 함수 이름 (대문자, btw)을 사용합니다. 파이썬에서 변수 또는 함수 이름 뒤에 오는} 호는 동기 오브젝트 호출 (이 경우에는 함수 호출)을 나타냄니다. 괄호없이 동일한 이름을 사용하면 함수를 생성중인 Process 개체의 매개 변수로 전달합니다. 인수는 args 매개 변수로 분리하여 전달됩니다.

그러나 그 외에도 다중 처리는 전역 변수로 전혀 작동하지 않습니다. - 이름에서 알 수 있듯이 각 함수는 다른 프로세스에서 실행되며 고유 한 전역 변수 집합을가집니다.

대신 약간 더 정교한 작업을 수행하고 하위 프로세스의 각 진입 점에 대한 매개 변수로 전달 된 (다중 처리) 대기열을 사용하여 병렬 코드에 대한 작업을 조정해야합니다.

확인 https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues

+0

고마워, jsbueno. 나의 마지막 코멘트는 첫 번째 함수 뒤에()를 넣은 것이 나쁘다. 너무 빨리 입력했다. 링크를 가져 주셔서 감사합니다. 네 말이 맞을거야. 나는 의사를 읽는 데 잠깐 시간을 할애 할 것이다. – danjmwalker