2013-05-09 127 views
0

在python中我打开了4个子进程。现在我想要在python脚本中发出新请求时终止所有先前的进程。如何杀死python中的所有子进程

我使用python 2.7和windows 7操作系统。

感谢,

+1

你是如何产卵的4子流程和你尝试过这么远吗? – gaige 2013-05-09 09:43:05

+0

其实我的目的是当新的请求来过程时,需要停止以前的过程。 – CrazyCoder 2013-05-09 09:47:40

+0

调度子流程是什么?如果你想杀掉以前的进程,这些进程的创建者(所有者)将拥有杀死它们所需的信息。例如 – gaige 2013-05-09 09:48:52

回答

0

如果您使用subprocess.Popen功能已经返回进程ID打开子可以使用os.kill功能

import os 
os.kill(process.pid) 

。但是,如果使用shell=True标志,请小心,因为在这种情况下,进程pid将是shell进程标识。如果这是你的情况here是一个可行的解决方案。

+0

是的我正在使用Shell = True标志。 – CrazyCoder 2013-05-09 10:03:13

+0

然后这可以帮助你http://stackoverflow.com/questions/4789837/how-to-terminate-a-python-subprocess-launched-with-shell-true – jvallver 2013-05-09 10:33:01

+0

是os.killpg在Windows中工作? – CrazyCoder 2013-05-09 11:32:08

1

在你的主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.But一个好的技巧,虽然

2

假设你要杀死所有的子进程没有跟踪他们,外部LIB 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() 
+0

当我使用此代码时,我得到了错误: WindowsError:[错误32]该进程无法访问该文件,因为它正在被另一个进程使用:'abc.txt' – CrazyCoder 2013-05-09 10:25:23

+0

这很奇怪......很少有选项回想起来 - 1.你的系统上没有sleep.exe(尽管这不会是错误32),2.也许它受到其他代码的影响。你是否在口译员那里尝试过? – itai 2013-05-12 07:16:05