문제

파이썬에서 간단한 다중 프로세스 응용 프로그램을 실행하려고합니다. 메인 스레드는 1에서 N에서 프로세스를 스폰하고 모두 처리를 마칠 때까지 기다립니다. 프로세스는 각각 무한 루프를 실행하므로 일부 사용자 중단 없이도 영원히 실행할 수 있으므로 키보드 인터럽트를 처리하기 위해 일부 코드를 넣습니다.

#!/usr/bin/env python
import sys
import time
from multiprocessing import Process

def main():
    # Set up inputs..

    # Spawn processes
    Proc( 1).start()
    Proc( 2).start()

class Proc ( Process ):
    def __init__ ( self, procNum):
        self.id = procNum
        Process.__init__(self)

    def run ( self ):
        doneWork = False

        while True:

            try:
                # Do work...
                time.sleep(1)
                sys.stdout.write('.')

                if doneWork:
                    print "PROC#" + str(self.id) + " Done."
                    break

            except KeyboardInterrupt:
                print "User aborted."
                sys.exit()

# Main Entry
if __name__=="__main__":
    main()

문제는 CTRL-C를 사용하여 종료 할 때 프로세스가 즉시 종료되는 것처럼 보이지만 추가 오류가 발생한다는 것입니다.

......User aborted.
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function
    p.join()
  File "C:\Python26\lib\multiprocessing\process.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt
Error in sys.exitfunc:
Traceback (most recent call last):
  File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function
    p.join()
  File "C:\Python26\lib\multiprocessing\process.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt

Windows에서 Python 2.6을 실행하고 있습니다. 파이썬에서 멀티 프로세싱을 처리하는 더 좋은 방법이 있다면 알려주십시오.

도움이 되었습니까?

해결책

오히려 단지 강제 sys.exit(), 당신은 당신의 스레드에 신호를 보내서 멈추라고 지시하고 싶습니다. 사용을 살펴보십시오 신호 처리기 파이썬의 실.

당신은 잠재적으로 당신의 변화를 통해 이것을 할 수 있습니다 while True: 루프 while keep_processing: 어디 keep_processing KeyboardInterrup 예외에서 설정되는 일종의 글로벌 변수입니다. 그래도 이것이 좋은 관행이라고 생각하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top