Python 在永久循环中打开和终止子进程的危险

Python 在永久循环中打开和终止子进程的危险,python,loops,subprocess,terminate,Python,Loops,Subprocess,Terminate,在永久循环中打开和终止子流程是否存在任何可能的危险?比如垃圾堆积、溢出等 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/

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

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();

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


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

您的计划的目的是什么?也许有更好的方法。我有几个视频。每个视频对应一个键盘输入。视频应该以无缝循环方式播放(使用hello_video.bin),除非我按另一个键输入。在我按下输入键后,当前视频应该消失,新的相应视频应该显示在屏幕上。如果我可以暂停不活动的视频(子进程),而不是停止它,那就太好了。1。2.
Popen.terminate()
生成
SIGTERM
信号(不同于
SIGKILL
)<代码>SIGTERM可以忽略。是,抱歉。你是对的。他应该检查进程是否真正终止的另一个原因。0
.terminate()
立即返回。它不等待任何子状态(睡眠或无睡眠)。它不直接与孩子沟通。SIGTERM是异步的。1.根据定义,僵尸是死的,也就是说,如果进程是活的(在这种情况下,如果它没有在SIGTERM上终止),那么它就不可能是僵尸。2. <代码>子进程模块跟踪活动的子进程,并在
Popen()
中获取僵尸,即,即使OP从不调用
,问题中的代码也不会创建很多僵尸。wait()
(或等效程序)是的,子进程可以忽略SIGTERM,这样它就不会是僵尸。但这是有可能的。(只是不太可能)。