【问题标题】:Danger of opening and terminating subprocess in a forever loop在永远循环中打开和终止子进程的危险
【发布时间】:2015-08-13 03:43:41
【问题描述】:

在永久循环中打开和终止子进程是否有任何可能的危险?像垃圾堆积、溢出等?

import subprocess
import time

while True: 

    a = subprocess.Popen(["./hello_video.bin", "/home/pi/test_plane.m4v"])
    time.sleep(10)
    a.terminate();

    b = subprocess.Popen(["./hello_video.bin", "/home/pi/test_girl.m4v"])
    time.sleep(10)
    b.terminate();

【问题讨论】:

  • 你的程序的目的是什么?可能有更好的做事方式。
  • 我有几个视频。每个视频对应一个键盘输入。除非我按另一个键输入,否则视频应该以无缝循环方式播放(使用 hello_video.bin)。在我按下一个键输入后,当前视频应该消失并且新的相应视频应该显示在屏幕上。如果我可以暂停非活动视频(子进程)而不是杀死它,那就太好了。

标签: python loops subprocess terminate


【解决方案1】:

是的。在 UNIX/Posix 上,它向进程发送一个 SIGTERM 信号。然后进程应该被终止,但在某些情况下它不会。当 Popen.terminate() 返回时,不能保证进程已经终止(例如,如果进程正在等待 I/O 或处于不可中断的睡眠中)。子进程可以很容易地忽略 SIGTERM。即使它不忽略 SIGTERM,它也可能变成僵尸。如果你真的需要在无限循环中终止进程,你应该检查进程是否真的被终止了。也看看 psutil 模块。

更新:从 SIGKILL 更改为 SIGTERM,感谢 J.F. Sebastian

【讨论】:

  • 1. SIGKILL always works。 2.Popen.terminate()产生SIGTERM信号(不同于SIGKILL)。 SIGTERM可以被忽略。
  • 是的,对不起。你说的对。他应该检查进程是否真的终止的另一个原因。
  • 0。 .terminate() 立即返回。它不等待任何子状态(睡眠或不睡眠)。它不直接与孩子交流。 SIGTERM 是异步的。 1. 根据定义,僵尸是死的,即如果进程是活着的(如果在这种情况下它没有在 SIGTERM 上终止)那么它就不可能是僵尸。 2.subprocess 模块跟踪活跃的孩子并在Popen() 中收割僵尸,即即使OP 从不调用.wait()(或等效项),问题中的代码也不会创建很多僵尸
  • 是的,子进程可以简单地忽略 SIGTERM,这样它就不会是僵尸了。但有可能是这样。 (只是不太可能)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多