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_processing
is 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_processing
KeyboardInterrupt 异常上设置的某种全局变量的位置来实现此目的。不过,我认为这不是一个好习惯。