Python的多重atexit对Error“错误的atexit._run_exitfuncs”
题
我试图运行在Python简单的多个进程的应用程序。主线程产卵1到N的过程和等待,直到他们都做了处理。每个进程中运行的无限循环,因此它们可以潜在地永远运行没有一些用户中断,所以我把在一些代码来处理一个KeyboardInterrupt:
#!/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。如果有更好的方式来处理Python多处理,请让我知道。
解决方案
而并非只是强迫sys.exit()
,你想发出一个信号,你的线程,告诉他们停止。考虑使用信号处理程序在Python 和线程。
您可能通过更改while True:
循环中while keep_processing:
其中keep_processing
是某种全局变量是大干快上的KeyboardInterrupt异常设置做到这一点。我不认为这是一个很好的做法,但。
不隶属于 StackOverflow