Python 多处理 atexit 错误“atexit._run_exitfuncs 中的错误”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/883370/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Python Multiprocessing atexit Error "Error in atexit._run_exitfuncs"
提问by
I am trying to run a simple multiple processes application in Python. The main thread spawns 1 to N processes and waits until they all done processing. The processes each run an infinite loop, so they can potentially run forever without some user interruption, so I put in some code to handle a KeyboardInterrupt:
我正在尝试在 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()
The problem is that when using CTRL-C to exit, I get an additional error even though the processes seem to exit immediately:
问题是,当使用 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
I am running Python 2.6 on Windows. If there is a better way to handle multiprocessing in Python, please let me know.
我在 Windows 上运行 Python 2.6。如果有更好的方法来处理 Python 中的多处理,请告诉我。
采纳答案by Jason Coon
Rather then just forcing sys.exit(), you want to send a signal to your threads to tell them to stop. Look into using signal handlersand threads in Python.
而不是只是强迫sys.exit(),你想向你的线程发送一个信号告诉他们停止。研究在 Python 中使用信号处理程序和线程。
You could potentially do this by changing your while True:loop to be while keep_processing:where keep_processingis some sort of global variable that gets set on the KeyboardInterrupt exception. I don't think this is a good practice though.
您可以通过将while True:循环更改为while keep_processing:在keep_processingKeyboardInterrupt 异常上设置的某种全局变量的位置来实现此目的。不过,我认为这不是一个好习惯。

