Python Multiprocessing atexit 오류“Atexit._run_exitfuncs의 오류”
문제
파이썬에서 간단한 다중 프로세스 응용 프로그램을 실행하려고합니다. 메인 스레드는 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 예외에서 설정되는 일종의 글로벌 변수입니다. 그래도 이것이 좋은 관행이라고 생각하지 않습니다.
제휴하지 않습니다 StackOverflow