如何杀死python中的所有子进程
在python中,我打开了4个子流程。现在我想在python脚本中出现新请求时终止所有以前的进程 我正在使用Python2.7和Windows7操作系统如何杀死python中的所有子进程,python,windows,subprocess,popen,Python,Windows,Subprocess,Popen,在python中,我打开了4个子流程。现在我想在python脚本中出现新请求时终止所有以前的进程 我正在使用Python2.7和Windows7操作系统 谢谢,您可以使用os.kill功能 import os os.kill(process.pid) 如果使用subprocess.Popen函数打开子流程,则已返回流程id。但如果使用shell=True标志,请小心,因为在这种情况下,进程pid将是shell进程id。如果这是您的情况,则是可行的解决方案。在生成子进程的主python脚本中,使
谢谢,您可以使用
os.kill
功能
import os
os.kill(process.pid)
如果使用
subprocess.Popen
函数打开子流程,则已返回流程id。但如果使用shell=True
标志,请小心,因为在这种情况下,进程pid将是shell进程id。如果这是您的情况,则是可行的解决方案。在生成子进程的主python脚本中,使用它发送/传递事件对象,并在主进程中使用事件保留子进程的引用
示例代码:
from multiprocessing import Process, Event
# sub process execution point
def process_function(event):
# if event is set by main process then this process exits from the loop
while not event.is_set():
# do something
# main process
process_event = {} # to keep reference of subprocess and their events
event = Event()
p = Process(target=process_function, args=(event))
p.start()
process_event[p] = event
# when you want to kill all subprocess
for process in process_event:
event = process_event[process]
event.set()
编辑正如您对问题所作的评论,我认为它在您使用subprocess.Popen的场景中不是很有用。但这是一个很好的技巧,尽管假定您想杀死所有子进程而不跟踪它们,外部库psutil使这变得很容易:
import os
import psutil
# spawn some child processes we can kill later
for i in xrange(4): psutil.Popen('sleep 60')
# now kill them
me = psutil.Process(os.getpid())
for child in me.get_children():
child.kill()
您是如何生成这4个子流程的?到目前为止您尝试了什么?实际上,我的目标是当新的流程请求出现时,需要停止以前的流程。什么是分派子流程?如果要终止以前的进程,这些进程的发起人(所有者)将拥有终止它们所需的信息。例如,我有两个进程,p=subprocess.Popen(“echo t |”,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.stdout)p1=subprocess.Popen([svn,“list”,“-R”,Url],shell=True,stdin=p.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)。communicate(),现在我需要在新请求到来时终止这两个进程。请将格式化的代码放入您的问题中。评论和重要信息中的内容很难阅读。是的,我正在使用Shell=True标志。那么这可以帮助您了解os.killpg是否在windows中工作?我不确定您是否必须尝试它。这不会杀死孩子当我使用此代码时,我得到的是eror:WindowsError:[错误32]进程无法访问该文件,因为另一个进程正在使用它:“abc.txt”这很奇怪。。。脑海中出现的几个选项-1。您的系统上没有sleep.exe(尽管这不是错误32),2。也许它会受到其他代码的影响。你有没有在口译员那里试过?