2014-08-29 3 views
-1

내가 다른 스크립트가 실행 한 반복을 위해 을의 main.py에 의해 호출 될 파이썬 스크립트 child.py을 가지고, child.py는 약 400ms 일멀티 스레딩/멀티 프로세싱을 사용하여 병렬로 효율적으로 파이썬 스크립트를 실행하는 방법은 무엇입니까?

지금 내가의 여러 인스턴스를 실행할 필요 child.py 동시에 (평행하게). 나는 다중 처리 모듈을 사용하여 for 루프를 호출하여 여러 프로세스를 작성했다.

하나의 반복을 실행하면 400ms가 걸렸습니다. 그러나 for 루프에서 반복 횟수를 늘리면 실행 시간도 거의 400ms의 배수로 증가합니다.

그래서 병렬 실행 대신 동기식으로 실행되는 것처럼 보입니다.

로그 파일에 타임 스탬프를 넣어 실행 시간을 확인했습니다.

스크립트의 병렬 실행이 많아도 실행 시간이 거의 400ms가되는 방법이 있습니까?

for device in device_list: 
      q= Queue.Queue() 
      p =Process(target=get_current_value, 
         args=(q,), 
         kwargs= 
          { 
            'device': device, 
            'service_list': service_list, 
            'data_source_list': data_source_list} 
          ) 
      p.start() 
      p.join() 
      logger.debug('data_source_list :'+ pformat(g.get())) 

get_current_value 당신은 당신의 모든 반복에 대한에 p.join()를 호출하고

+1

코드를 표시하지 않고 코드를 디버깅하도록 요청하는 중입니까? 어떻게 이것이 효과가 있다고 기대합니까? 당신은 거의 확실하게 당신의 코드에서 잘못된 것을하고 있습니다 만, 당신이 잘못 할 수있는 많은 것들이 있습니다. 아무도 모든 가능성을 짐작하려고하지 않을 것입니다. – abarnert

답변

1

을 호출되는 스크립트 child.py의 기능입니다 : 여기


내 스크립트입니다 루프는 하나의 프로세스를 시작하고 프로세스가 완료 될 때까지 기다린 후 다음 프로세스로 넘어 간다는 것을 의미합니다. 그래서 당신은 실제로 아무 것도 평행하지 않습니다. p.join()에 대한 호출을 제거하면 실제 동시 실행이 이루어집니다.

for device in device_list: 
    q = Queue.Queue() 
    p = Process(target=get_current_value, 
       args=(q,), 
       kwargs= 
       { 
        'device': device, 
        'service_list': service_list, 
         'data_source_list': data_source_list} 
       ) 
    p.start() 
    #p.join() 
+0

아 !! !! 정말 ?? 나는 p.join()이 모든 후속 하위 프로세스를 기다리게 할 것이라고 생각했지만, 하나의 만기는 남기지 않았습니다. – dotslash

관련 문제