2013-08-15 3 views
1

현재 많은 프로세스를 실행해야하는 파이썬에서 시뮬레이션 프로그램을 실행 중입니다. 이러한 각 프로세스에는 특정 코드 블록을 실행하는 루프가 있습니다.파이썬 다중 처리 프로그램에서 루프를 켜고 끄기

내가 직면 한 문제는 알 수없는 시간 동안 실행해야한다는 것입니다 (실험이 완료 될 때까지). 이 시간의 가치를 미리 알 수있는 방법이 없습니다.

나는 프로세스를 종료하는 방법을 찾고 있거나 실험이 끝나면 프로세스가 실행을 멈추게 할 수 있습니다.

현재 저는 Python의 다중 처리 모듈에서 Manager를 사용하여 플래그 변수를 만들었습니다. 각 자식 프로세스는이 플래그가 true로 설정된 동안에 만 실행되는 루프를 포함합니다. 이렇게하면 문제가 해결되지만 토글 플래그가 false로 설정된 경우 각 프로세스마다 많은 오류가 발생합니다. 내가 여기에 갈 것을 시도하고 무엇을 할 수있는 적절한 방법이 있는지


Traceback (most recent call last): 
File "C:\Python33\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
File "C:\Python33\lib\multiprocessing\process.py", line 95, in run 
    self._target(*self._args, **self._kwargs) 
File "C:\Users\Michael\PycharmProjects\untitled1\pmonitor.py", line 33, in backgroundTaskLauncher 
    while flag[0]: 
File "<string>", line 2, in __getitem__ 
File "C:\Python33\lib\multiprocessing\managers.py", line 726, in _callmethod 
    conn.send((self._id, methodname, args, kwds)) 
File "C:\Python33\lib\multiprocessing\connection.py", line 207, in send 
    self._send_bytes(buf.getbuffer()) 
File "C:\Python33\lib\multiprocessing\connection.py", line 281, in _send_bytes 
    ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) 
BrokenPipeError: [WinError 232] The pipe is being closed 
Process Process-20: 

이 궁금입니다. 올바른 용어를 사용하고 있는지 확실하지 않습니다.

다음과 같이 주요 공정의 코드는 다음과 같습니다

if __name__ == '__main__': 
    manager = Manager() 
    flag = manager.list([True]) 
    for taskSize in taskSizes: 
     flag[0] = True 
     for i in range(1,TASK_LAUNCHERS): 
      Process(target=backgroundTaskLauncher, args=(taskSize,flag)).start() 
      #Experiment goes here 
     flag[0] = False 

발사 과정에서의 코드는 다음과 같습니다

def backgroundTaskLauncher(taskSize,flag): 
    while flag[0]: 
     for i in range(0,CHUNK_AMOUNT): 
      Thread(target=task, args=(taskSize,)).start() 
      sleep(MICROCHUNK_GAP) 
     sleep(INTERCHUNK_GAP*random.random()*2) 

는 본질적으로 주요 방법은 backgroundTaskLauncher 프로세스의 번호로 전화를 누가 차례 , 토글 플래그가 사용 가능한 동안 많은 스레드를 시작하고 플래그가 사용 불가능할 때 중지 및 완료하십시오.

이 문제를 해결하는 적절한 방법을 찾고 있습니다.

+3

내가 _some_ 코드를 업로드 제안이 시도 그래서 자식 프로세스는 자신의 아빠 ;-)

않고 ​​남아 있습니다. – Josh

+0

우리가 볼 수없는 코드에서 문제를 디버깅 해달라고 요청하고 있습니다. 그것은하기가 매우 어렵습니다. – abarnert

+0

죄송합니다. 코드를 추가했습니다. – user2059807

답변

0

프로그램이 끝나기 전에 자녀 과정에 참여하지 못한 것 같습니다.

if __name__ == '__main__': 
    manager = Manager() 
    flag = manager.list([True]) 
    for taskSize in taskSizes: 
     flag[0] = True 
     processes = [] # a list to store the process handles 
     for i in range(1,TASK_LAUNCHERS): 
      p = Process(target=backgroundTaskLauncher, args=(taskSize,flag)) 
      p.start() 
      processes.append(p) # save process handle 
     # Experiment goes here (I think it goes here (unindented(?))) 
     flag[0] = False 
     # after you are done with your experiment, join all child processes 
     for p in processes: 
      p.join() 
+0

그게 문제를 해결했습니다. 고맙습니다. – user2059807

+0

오신 것을 환영합니다. 귀하의 질문에 올바르게 대답한다고 생각되면 문제가 해결되었음을 나타내는 대답을 "수락 됨"으로 표시하십시오. (코멘트는 질문 또는 답변에 대한 자세한 정보를 의미합니다.) – dastrobu

관련 문제