小编典典

呵呵,我昨天自己在研究这个!假设您无法更改子程序:

在Linux上,prctl(PR_SET_PDEATHSIG,...)可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTERM;链接到的代码使用SIGTERM,但是子级确实可以选择忽略SIGTERM。

在Windows上,最可靠的选择是使用Job对象。想法是创建一个“作业”(一种用于流程的容器),然后将子流程放入作业中,并设置魔术选项,指出“当没有人握住该作业的“手柄”时,然后杀死其中的进程”。默认情况下,作业的唯一“句柄”是父进程持有的句柄,并且当父进程死掉时,操作系统将遍历并关闭其所有句柄,然后注意这意味着没有用于工作。因此,它会按要求杀死孩子。包含使用该win32api模块执行此操作的示例代码。该代码使用CreateProcess发射子,而不是subprocess.Popen。原因是他们需要为生成的子项获取一个“进程句柄”,并CreateProcess默认将其返回。如果您愿意使用subprocess.Popen,那么这是该答案中代码的(未经测试的)副本,它使用subprocess.Popen和OpenProcess代替CreateProcess:

import subprocess

import win32api

import win32con

import win32job

hJob = win32job.CreateJobObject(None, "")

extended_info = win32job.QueryInformationJobObject(hJob, win32job.JobObjectExtendedLimitInformation)

extended_info['BasicLimitInformation']['LimitFlags'] = win32job.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE

win32job.SetInformationJobObject(hJob, win32job.JobObjectExtendedLimitInformation, extended_info)

child = subprocess.Popen(...)

# Convert process id to process handle:

perms = win32con.PROCESS_TERMINATE | win32con.PROCESS_SET_QUOTA

hProcess = win32api.OpenProcess(perms, False, child.pid)

win32job.AssignProcessToJobObject(hJob, hProcess)

从技术上讲,这里有一个很小的比赛条件,以防孩子在Popen和OpenProcess呼叫之间死亡,您可以决定是否要担心这一点。

使用作业对象的一个​​缺点是,在Vista或Win7上运行时,如果从Windows

Shell启动程序(即,通过单击图标),则可能已经分配了一个作业对象并尝试创建一个作业对象。新的作业对象将失败。Win8可以解决此问题(通过允许嵌套作业对象),或者如果您的程序是从命令行运行的,那么应该可以。

如果您 可以

修改子级(例如,像使用时一样multiprocessing),那么最好的选择可能是以某种方式将父级的PID传递给子级(例如,作为命令行参数,或者在的args=参数中multiprocessing.Process),然后:

在POSIX上:在子级中生成一个os.getppid()偶尔会调用的线程,如果返回值停止匹配从父级传入的pid,则调用os._exit()。(这种方法可移植到包括OS

X在内的所有Unix上,而prctl窍门是特定于Linux的。)

在Windows上:在使用OpenProcess和的子代中产生一个线程os.waitpid。使用ctypes的示例:

from ctypes import WinDLL, WinError

from ctypes.wintypes import DWORD, BOOL, HANDLE

# Magic value from http://msdn.microsoft.com/en-us/library/ms684880.aspx

SYNCHRONIZE = 0x00100000

kernel32 = WinDLL("kernel32.dll")

kernel32.OpenProcess.argtypes = (DWORD, BOOL, DWORD)

kernel32.OpenProcess.restype = HANDLE

parent_handle = kernel32.OpenProcess(SYNCHRONIZE, False, parent_pid)

# Block until parent exits

os.waitpid(parent_handle, 0)

os._exit(0)

这避免了我提到的作业对象的任何可能的问题。

如果您想真正确定,那么可以组合所有这些解决方案。

希望有帮助!

2020-06-02

python 杀死子进程_Python:当父异常终止时,如何杀死子进程?相关推荐

  1. c python 内存冲突_Python在计算内存时应该注意的问题?

    我之前的一篇文章,带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密.文中使用了sys.getsizeof()来计算内存,但是用这个方法计算时,可能会出现意料不到的问题. ...

  2. python主进程 子进程_Python关闭主进程时关闭子进程

    作为@tony suggested,您可以在使用multiprocessing模块创建的子进程上设置daemon=True标志.要在python2.4上安装它,请键入:pip install mult ...

  3. python核心理念_Python 之父谈放弃 Python:我对核心成员们失望至极!

    Python 之父讲述退位原因,以及 Python 的未来将何去何从. 在 Python 社区,Python 的发明者 Guido Van Rossum 被称为 "仁慈的终生独裁者" ...

  4. python 编译器重构_Python之父考虑重构Python解释器

    7月22日,Python之父Guido在Medium上发表了他的第一篇博文<PEG Parser>. 在该文中,Guido说他正在考虑使用PEG Parser代替现有的类LL(1) Par ...

  5. python部落稿酬_Python之父考虑重构Python解释器

    作者:佚名来源:Python部落 7月22日,Python之父Guido在Medium上发表了他的第一篇博文<PEG Parser>. 在该文中,Guido说他正在考虑使用PEG Pars ...

  6. python 隐藏进程_python在windows下创建隐藏窗口子进程的方法

    python在windows下创建隐藏窗口子进程的方法 发布于 2015-11-08 20:56:53 | 213 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一 ...

  7. 看漫画学python百度云_Python之父推荐:用一本漫画学python,入门python全靠它

    一本漫画学python 相信大家都看过周星驰的电影<一本漫画闯天涯>,那么你有没有听过一本漫画写python呢? 没错,看漫画也能学python!下面我们来看一下什么"漫画书&q ...

  8. python oj 输入_Python写OJ题时输入问题

    # encoding: utf-8 ''' Created on Nov 6th, 2014 @author: Speedcell ''' '''Python的输入是野生字符串,所以要自己转类型 st ...

  9. 学python去吧_Python教父推荐的一份Python学习清单,秀儿拿走学去吧,最适合你

    站在风口上,猪都能飞起来.人工智能风口,让Pyhon这门胶水语言转变成非常火的网红语言. 编程功力深厚的程序员花一两个星期就能上手Python,而一些新手程序员花几个月就可以上手. 学编程,用Pyth ...

最新文章

  1. 再读《数量生态学:R语言应用》
  2. 所谓完整的linux系统包括哪些部分呢?【转】
  3. github是什么?
  4. TCP的状态转换及生产问题实操
  5. Gartner认为安全性将取代成本和敏捷性成为政府部门采用云服务的首要原因
  6. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)
  7. 数据结构-王道-排序
  8. ajax连接前后端原理,前后端数据交互方法和原理
  9. js错误处理权威指北
  10. ZeroClipboard / jquery.zclip.min.js跨浏览器复制插件使用中遇到的问题解决
  11. cocos2dx lua加密 和 解密
  12. 理解服务器证书 CASSL
  13. css如何使文字抖动,CSS美化:实现抖音彩色文字抖动效果
  14. [PyQt5]基本控件19 - 分割条QSplitter
  15. 如何安装谷歌服务框架?(Google三件套下载教程)
  16. 1949-2020年全国31省铁路里程数据
  17. 安装 office2007时出现:1706的错误-解决方案
  18. 五类、超五类、六类跳线
  19. 【JoJo的摄影笔记】相机分类新约
  20. 虚拟时钟(Virtual clock)

热门文章

  1. python bottle框架 重定向_Python的web框架bottle静态文件的路径
  2. linux ejb远程调用,[转载]在容器外使用EJB 3.0 Persistence
  3. bat php 监控网站,bat curl 发送http请求 监控网站
  4. java基础之多态的详细解释_JAVA基础之多态
  5. 实验7-3-4 字符串替换 (15分)
  6. android 嵌套分组拖动_GitHub - Mosect/DragLayout: Android拖拽控件,支持上下左右滑动、折叠或者嵌套ListView、RecyclerView等...
  7. wamp增加php,新版PHPWAMP自定义添加PHP版本方法步骤
  8. linux 组的管理,LINUX用户组管理各命令的使用
  9. aix服务器屏幕显示被锁住了,AIX恢复密码过程总结
  10. html中超链接使用_HTML实例源码