2016-02-10 4 views
1
import multiprocessing as mp 
import time as t 

class MyProcess(mp.Process): 

    def __init__(self, target, args, name): 
     mp.Process.__init__(self, target=target, args=args) 
     self.exit = mp.Event() 
     self.name = name 
     print("{0} initiated".format(self.name)) 

    def run(self): 
     while not self.exit.is_set(): 
      pass 
     print("Process {0} exited.".format(self.name)) 

    def shutdown(self): 
     print("Shutdown initiated for {0}.".format(self.name)) 
     self.exit.set() 

def f(x): 
    while True: 
     print(x) 
     x = x+1 

if __name__ == "__main__": 
    p = MyProcess(target=f, args=[3], name="function") 
    p.start() 
    #p.join() 
    t.wait(2) 
    p.shutdown() 

Я пытаюсь расширить класс multiprocessing.Process добавить метод отключения для того, чтобы иметь возможность выйти из функции, которая потенциально может иметь для запуска в течение неопределенного периода времени. Следуя инструкции из Python Multiprocessing Exit Elegantly How? и добавления передачи аргумента я придумал сам, только получаешь мне этот выход:Расширение mp.Process в Python 3

function initiated 
Shutdown initiated for function. 
Process function exited. 

без реального выхода метода f(x). Кажется, что фактическая цель процесса не начинается. Я, очевидно, что-то делаю неправильно, но просто не могу понять, какие идеи?

Спасибо!

+1

Метод 'run' в базовом классе отвечает за фактическое выполнение целевой функции. Поскольку вы переопределили этот метод, ваша целевая функция никогда не запускается. –

+0

Так что я должен попробовать и скопировать исходный метод 'run' в цикле' while' метода 'мой' 'run'? –

+1

Вы могли бы это сделать, но это не поможет. Вам необходимо изменить целевую функцию, чтобы периодически проверять событие 'exit'. –

ответ

1

Здравый способ справиться с этой ситуацией - по возможности, чтобы фоновая задача взаимодействовала в механизме выхода, периодически проверяя событие exit. Для этого нет необходимости в подклассе Process: вы можете переписать свою фоновое задание, включив эту проверку. Например, вот ваш код переписан с использованием этого подхода:

import multiprocessing as mp 
import time as t 

def f(x, exit_event): 
    while not exit_event.is_set(): 
     print(x) 
     x = x+1 
    print("Exiting") 

if __name__ == "__main__": 
    exit_event = mp.Event() 
    p = mp.Process(target=f, args=(3, exit_event), name="function") 
    p.start() 
    t.sleep(2) 
    exit_event.set() 
    p.join() 

Если это не вариант (например, потому что вы не можете изменить код, который запущен в фоновом режиме работы), то вы можете использовать метод Process.terminate , Но вы должны знать, что использование этого опасно: дочерний процесс не будет иметь возможности правильно очищать, например, если он выключен, удерживая блокировку многопроцессорности, ни один другой процесс не сможет получить эту блокировку, риск тупика. Гораздо лучше, если ребенок будет сотрудничать при завершении работы.

Смежные вопросы