Python 2.7 python2多处理无法使用键盘中断正常退出程序

Python 2.7 python2多处理无法使用键盘中断正常退出程序,python-2.7,multiprocessing,Python 2.7,Multiprocessing,我有下面的程序,我想它退出优雅的键盘中断。日志打印出来了 INFO:__main__:Stopping INFO:__main__:Stopped 但是我仍然可以看到在再次使用Ctrl+C时进程正在运行,我得到了以下异常 Error in atexit._run_exitfuncs: Traceback (most recent call last): File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitf

我有下面的程序,我想它退出优雅的键盘中断。日志打印出来了

INFO:__main__:Stopping
INFO:__main__:Stopped
但是我仍然可以看到在再次使用Ctrl+C时进程正在运行,我得到了以下异常

Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib/python2.7/multiprocessing/util.py", line 328, in _exit_function
    p.join()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 148, in join
    res = self._popen.wait(timeout)
  File "/usr/lib/python2.7/multiprocessing/forking.py", line 154, in wait
    return self.poll(0)
  File "/usr/lib/python2.7/multiprocessing/forking.py", line 135, in poll
    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt
代码

class JobRunner(object):

    def __init__(self, config):
        self._threads = []
        LOGGER.info('Init')
        
    def do_work(self, i):
        LOGGER.info('Working, %s'%i)

    def run(self):
        for i in range(5):
            t = threading.Thread(target=self.do_work, args=(i))
            t.start()
            self._threads.append(t)
        LOGGER.info('Running')

    def stop(self):
        LOGGER.info('Stopping')
        for thread in self._threads:
            thread.join()
        LOGGER.info('Stopped')

def runJobrunner(config, a=None):
    runner = JobRunner(config)
    queue.put(runner)
    runner.run()

def parmap(f, X):
    proc = [multiprocessing.Process(target=f, args=(c, )) for c in X]
    [p.start() for p in proc]
    [p.join() for p in proc]
    return proc


if __name__ == "__main__":
    if len(sys.argv) < 2:
        sys.exit('Usage: %s config-file' % sys.argv[0])

    try:
        config = configparser.ConfigParser()
        if args[0]:
            config.read(args[0])
        queue = multiprocessing.Queue()
        if config.has_section('runner'):
        proc = parmap(functools.partial(runJobrunner, config), range(multiprocessing.cpu_count()) )
            
    except KeyboardInterrupt:
        while not queue.empty(): 
            runner = queue.get()
            runner.stop()
        [p.join() for p in proc]
        [p.terminate() for p in proc]
    except Exception as e:
        print(traceback.format_exc())
        LOGGER.error(str(e))
类作业运行程序(对象):
定义初始化(自我,配置):
self._线程=[]
LOGGER.info('Init')
def do_工作(自我,i):
LOGGER.info('正在工作,%s'%i)
def运行(自):
对于范围(5)中的i:
t=threading.Thread(target=self.do_work,args=(i))
t、 开始()
self.\u threads.append(t)
LOGGER.info('正在运行')
def停止(自):
LOGGER.info('正在停止')
对于自线程中的线程。\u线程:
thread.join()
LOGGER.info('已停止')
def runJobrunner(配置,a=None):
runner=JobRunner(配置)
queue.put(运行程序)
runner.run()
def parmap(f,X):
proc=[multiprocessing.Process(target=f,args=(c,))用于X中的c]
[p.start()表示进程中的p]
[p.join()表示进程中的p]
返回过程
如果名称=“\uuuuu main\uuuuuuuu”:
如果len(系统argv)<2:
sys.exit('用法:%s配置文件'%sys.argv[0])
尝试:
config=configparser.configparser()
如果args[0]:
config.read(参数[0])
队列=多处理。队列()
如果config.has_节('runner'):
proc=parmap(functools.partial(runJobrunner,config),range(multiprocessing.cpu\u count())
除键盘中断外:
而不是queue.empty():
runner=queue.get()
停止
[p.join()表示进程中的p]
[p.terminate()表示进程中的p]
例外情况除外,如e:
打印(traceback.format_exc())
记录器错误(str(e))
因为我使用的是Python2,所以这个解决方案的灵感来源于这篇文章

现在如何优雅地退出

谢谢