【问题标题】:How do I know when a child process died in python3 on windows platform?我如何知道 Windows 平台上的 python3 中的子进程何时死亡?
【发布时间】:2018-05-29 11:38:19
【问题描述】:

在 linux 中,我使用 subprocess.Popen 创建一个子进程,并为 SIGCHLD 定义一个信号处理程序。当子进程死亡时,父进程收到 SIGCHLD 信号,处理程序将做某事。

但是在 Windows 上没有 SIGCHLD 信号,我怎么知道子进程何时退出?

【问题讨论】:

  • 你可以使用tasklist或者通过子进程通信来学习。
  • @dsgdfg 子进程可能需要很长时间才能退出,所以我需要一个非阻塞的方法。如果使用communicate(),我的主进程将被阻塞...
  • No Method - Let me go 因为 Windows 和 Linux 内核的工作方式不同,它不会自动创建 Windows 应用程序树(在第三方软件中)。为此,您必须使用 API 或其他应用程序。你为什么要关注你已经独自一人的应用程序?写入另一个线程并在最后更改一个变量。

标签: python process synchronization subprocess


【解决方案1】:

您可以使用 TASKLIST FI(Filter) 方法验证给定的 pid 是否存在。 所以这个想法是

1) 生成一个process.pid

2) 使用TASK列表过滤功能查看PID的状态

例如

TASKLIST /FI "PID eq 6228"

3) 杀死 pid

4) 再次查看pid的状态,它应该不存在

下面是代码,它会做同样的事情

from subprocess import Popen,PIPE,CREATE_NEW_CONSOLE
import subprocess


command='cmd /K '

#This will open a new command prompt window 
p1=Popen(command,creationflags=subprocess.CREATE_NEW_CONSOLE)

#printing the pid value
print p1.pid


# created a function to  Verify if the pid exist
def check_pid():
    command1="TASKLIST /FI "+ '"PID eq '+ str(p1.pid)+'"'
    p2=Popen(command1,stdout=PIPE)
    out=p2.communicate()[0]
    print out


#Kill the pid 
import subprocess
subprocess.Popen('taskkill /F /T /PID %i' % p1.pid)

#wait for some time and see if the pid exist

import time
time.sleep(3)

check_pid()

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多