2013-05-09 3 views
0

В python я открыл 4 подпроцесса. Теперь я хочу убить весь предыдущий процесс, когда новый запрос поступит в скрипт python.как убить весь подпроцесс в python

Я использую python 2.7 и ОС Windows 7.

Спасибо,

+1

Как вы порождая 4 подпроцессы и что вы пробовали до сих пор? – gaige

+0

На самом деле, моя цель - когда новый запрос приходит для процесса, нужно остановить предыдущий процесс. – CrazyCoder

+0

Что такое отправка подпроцессов? Если вы хотите убить предыдущие процессы, у создателя (владельца) этих процессов будет информация, необходимая для их уничтожения. – gaige

ответ

0

Вы можете использовать функцию os.kill

import os 
os.kill(process.pid) 

Если открыть подпроцесс с помощью функции subprocess.Popen уже возвращает идентификатор процесса. Но будьте осторожны, если вы используете флаг shell=True, потому что в этом случае процесс pid будет идентификатором процесса оболочки. Если это ваш случай here - это положительное решение.

+0

Да Я использую флаг Shell = True. – CrazyCoder

+0

Тогда это может помочь вам http://stackoverflow.com/questions/4789837/how-to-terminate-a-python-subprocess-launched-with-shell-true – jvallver

+0

os.killpg работает в окнах? – CrazyCoder

1

В главной питон скрипт, где вы порождая подпроцесс отправить/передать объект Event с ним и сохранить ссылку на ваш подпроцесса с событием в основном процессе

Пример кода:

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

Редактировать
Как вы прокомментировали свой вопрос, я думаю, что это не очень полезно в вашем сценарии, поскольку вы используете подпроцесс.Popen. Но хороший трюк, хотя

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

Когда я использовал этот код, я получаю eror: WindowsError: [Ошибка 32] Процесс не может получить доступ к файлу, потому что он используется другим процессом: 'abc.txt' – CrazyCoder

+0

Thats very odd ... Несколько вариантов которые приходят на ум - 1. у вас нет sleep.exe в вашей системе (хотя это не ошибка 32), 2. возможно, это каким-то образом повлияло на остальную часть вашего кода. Вы попробовали это только в интерпретаторе? – itai