Python多处理atexit错误"atexit._run_exitfuncs中的错误"

9 python process interrupt atexit

我试图在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()
Run Code Online (Sandbox Code Playgroud)

问题是当使用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
Run Code Online (Sandbox Code Playgroud)

我在Windows上运行Python 2.6.如果有更好的方法来处理Python中的多处理,请告诉我.

Jas*_*oon 1

sys.exit()您想要向线程发送信号以告诉它们停止,而不是仅仅强制。研究在 Python 中使用信号处理程序和线程。

您可以通过将while True:循环更改为在 KeyboardInterrupt 异常上while keep_processing: 设置keep_processing的某种全局变量来实现此目的。但我认为这不是一个好的做法。

  • 如果可能的话,您能否添加此解决方案的可运行示例。 (5认同)