首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理KeyboardInterrupt处理

多处理KeyboardInterrupt处理
EN

Stack Overflow用户
提问于 2015-12-26 16:18:20
回答 1查看 955关注 0票数 0

这个问题似乎一直在回避我--所有的解决方案都更像是解决方案,并且给代码增加了相当多的复杂性。既然这方面的帖子已经发布了很长时间,那么有什么simple解决方案可以解决以下问题--在检测到键盘中断后,干净地退出所有的儿童进程,终止程序?

下面的代码是我的多进程结构的代码片段--我想在添加所需功能的同时保留尽可能多的可执行性:

代码语言:javascript
复制
from multiprocessing import Pool
import time

def multiprocess_init(l):
    global lock
    lock = l

def synchronous_print(i):
    with lock:
        print i
        time.sleep(1)

if __name__ == '__main__':

    lock = Lock()
    pool = Pool(processes=5, initializer=multiprocess_init, initargs=(lock, ))

    for i in range(1,20):
        pool.map_async(synchronous_print, [i])

    pool.close() #necessary to prevent zombies
    pool.join() #wait for all processes to finish
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-26 19:39:19

简单的回答是移到python3.Python 2中,在python 3中已经解决了线程/进程同步的多个问题。

在您的情况下,每次发送键盘中断时,multiprocessing都会顽强地重新创建您的子进程,pool.close就会卡住,永远不会退出。您可以通过使用os.exit显式退出子进程并等待来自apply_async的单个结果来减少问题,这样您就不会陷入pool.close监狱。

代码语言:javascript
复制
from multiprocessing import Pool, Lock
import time
import os

def multiprocess_init(l):
    global lock
    lock = l
    print("initialized child")

def synchronous_print(i):
    try:
        with lock:
            print i
            time.sleep(1)
    except KeyboardInterrupt:
        print("exit child")
        os.exit(2)

if __name__ == '__main__':

    lock = Lock()
    pool = Pool(processes=5, initializer=multiprocess_init, initargs=(lock, ))

    results = []
    for i in range(1,20):
        results.append(pool.map_async(synchronous_print, [i]))

    for result in results:
        print('wait result')
        result.wait()

    pool.close() #necessary to prevent zombies
    pool.join() #wait for all processes to finish
    print("Join completes")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34473069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档