В python я открыл 4 подпроцесса. Теперь я хочу убить весь предыдущий процесс, когда новый запрос поступит в скрипт python.как убить весь подпроцесс в python
Я использую python 2.7 и ОС Windows 7.
Спасибо,
В python я открыл 4 подпроцесса. Теперь я хочу убить весь предыдущий процесс, когда новый запрос поступит в скрипт python.как убить весь подпроцесс в python
Я использую python 2.7 и ОС Windows 7.
Спасибо,
Вы можете использовать функцию os.kill
import os
os.kill(process.pid)
Если открыть подпроцесс с помощью функции subprocess.Popen
уже возвращает идентификатор процесса. Но будьте осторожны, если вы используете флаг shell=True
, потому что в этом случае процесс pid будет идентификатором процесса оболочки. Если это ваш случай here - это положительное решение.
Да Я использую флаг Shell = True. – CrazyCoder
Тогда это может помочь вам http://stackoverflow.com/questions/4789837/how-to-terminate-a-python-subprocess-launched-with-shell-true – jvallver
os.killpg работает в окнах? – CrazyCoder
В главной питон скрипт, где вы порождая подпроцесс отправить/передать объект 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. Но хороший трюк, хотя
Предполагая, что вы хотите, чтобы убить все ребенок процессов без отслеживания их внешний 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()
Когда я использовал этот код, я получаю eror: WindowsError: [Ошибка 32] Процесс не может получить доступ к файлу, потому что он используется другим процессом: 'abc.txt' – CrazyCoder
Thats very odd ... Несколько вариантов которые приходят на ум - 1. у вас нет sleep.exe в вашей системе (хотя это не ошибка 32), 2. возможно, это каким-то образом повлияло на остальную часть вашего кода. Вы попробовали это только в интерпретаторе? – itai
Как вы порождая 4 подпроцессы и что вы пробовали до сих пор? – gaige
На самом деле, моя цель - когда новый запрос приходит для процесса, нужно остановить предыдущий процесс. – CrazyCoder
Что такое отправка подпроцессов? Если вы хотите убить предыдущие процессы, у создателя (владельца) этих процессов будет информация, необходимая для их уничтожения. – gaige