2013-05-09 86 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