Как перезапустить процесс, используя многопроцессорный модуль Python - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь перезапустить процесс python, используя многопроцессорный модуль, но появляется сообщение «AssertionError: невозможно запустить процесс дважды».

Мой вопрос

  • Как перезапустить процесс
  • После того, как его завершают, почему он собирается мод зомби
  • Как я могу удалить процесс зомби
import time
from multiprocessing import Process

def worker ():
    while True:
        print "Inside the worker"
        time.sleep(10)


p1 = Process(target=worker,name="worker")
p1.start()
#p1.join()

time.sleep(3)

p1.terminate()
print "after Termination "
time.sleep(3)


p1.start()


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

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Как перезапустить процесс?

Невозможно перезапустить завершенный процесс.Вам нужно создать новый процесс.

Как только он завершит свою работу, почему он собирается использовать мод зомби?

Поскольку в системах Unix-y родительский процесс должен прочитатькод выхода до того, как ядро ​​очистит соответствующую запись из таблицы процессов.

Как удалить процесс зомби?

У вас есть несколько вариантов.Я цитирую документы здесь:

Присоединение к процессам зомби

В Unix, когда процесс завершается, но не присоединен, он становится зомби.Никогда не должно быть очень много, потому что каждый раз, когда начинается новый процесс (или вызывается active_children ()), все завершенные процессы, которые еще не были присоединены, будут объединены.Также вызов завершенного процесса Process.is_alive присоединится к процессу.Даже в этом случае, вероятно, хорошей практикой является явное объединение всех процессов, которые вы запускаете.


На самом деле я пытаюсь создать функцию монитора процесса для наблюденияиспользование памяти и процессора всеми процессами.

Для этого вы должны взглянуть на модуль psutil .

В случае, если вы просто хотите приостановить (не убивает) процессы, если потребление памяти становится слишком высоким, вы можете черпать вдохновение из моего ответа здесь .

0 голосов
/ 07 февраля 2019

Я надеюсь, что это поможет вам

import time
from multiprocessing import Process

def worker ():
    while True:
        print "Inside the worker"
        time.sleep(10)

def proc_start():
    p_to_start = Process(target=worker,name="worker")
    p_to_start.start()
    return p_to_start


def proc_stop(p_to_stop):
    p_to_stop.terminate()
    print "after Termination "


p = proc_start()
time.sleep(3)
proc_stop(p)
time.sleep(3)

p = proc_start()
print "start gain"
time.sleep(3)
proc_stop(p)
...