为了账号安全,请及时绑定邮箱和手机立即绑定

python kill 主线程后如何让子线程也停止执行?

python kill 主线程后如何让子线程也停止执行?

婷婷同学_ 2019-03-16 13:00:42
这是我写的测试用例代码,可以执行后, kill -9 主线程后,子线程并没有退出,仍然在执行,但是如果 ctrl+c,却可以停掉所有的线程。请问如何在父进程结束时,自动回收子进程,谢谢!如果有 pip 模块能解决此问题就更好了。这是我的测试用例代码:# -*- coding: utf-8 -*-# Author: Ztjimport timefrom multiprocessing import Processclass Listen(object):     def listen(self, ):         """监听"""         for i in range(3):             p = Process(name='Job', target=self.listen_callback, args=(i,))             p.start()    @staticmethod     def listen_callback(i):         """定时进程回调"""         while True:             print('正在执行中(%s)......' % i)             time.sleep(1)if __name__ == '__main__':     listen = Listen()     listen.listen()
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

之前也解决过这样的问题,用到了psutil模块,原理就是子进程定期检查父进程是否存在,不存在就退出。例子如下:

from multiprocessing import Processimport timeimport psutilimport osdef worker(pid, n):
    pps = psutil.Process(pid=pid)    while True:        try: 
            if pps.status() in (psutil.STATUS_DEAD, psutil.STATUS_STOPPED):                break
        except psutil.NoSuchProcess:            break

        # 处理...
        print(n, time.time())
        time.sleep(1)if __name__ == '__main__':
    ps = []
    pid = os.getpid()    for code in ('aa','bb','cc'):
        p = Process(target=worker, args=(pid, code,))
        p.daemon = True
        p.start()
        ps.append(p)    
    for p in ps:
        p.join()
    
    print('parent exit!!!!!!')


查看完整回答
反对 回复 2019-03-16
  • 2 回答
  • 0 关注
  • 2663 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信