我试图运行在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异常设置做到这一点。我不认为这是一个很好的做法,但。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top