如何使用python多处理模块重新启动进程

时间:2019-02-07 14:13:26

标签: python multiprocessing python-multiprocessing

我正在尝试使用多处理模块重新启动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()


实际上,我正在尝试创建一个进程监控器功能来监视所有进程的内存和CPU使用率。如果达到一定水平,我想实时重启

3 个答案:

答案 0 :(得分:1)

我希望它将对您有帮助

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)

答案 1 :(得分:1)

  

如何重新启动该过程?

您无法重新启动终止的进程。您需要实例化一个新过程。

  

一旦终止,为什么要进入僵尸模式?

因为在Unix-y系统上,父进程需要在内核从进程表中清除相应条目之前读取退出代码。

  

如何删除僵尸进程?

您有多种选择。我在这里引用docs

  

加入僵尸进程

     

在Unix上,当进程完成但尚未加入时,它将成为僵尸。永远不要有太多,因为每次启动新进程(或调用active_children()时),所有尚未加入的已完成过程都将加入。同时调用已完成流程的Process.is_alive将加入该流程。即便如此,将您启动的所有进程明确加入也可能是一个好习惯。


  

实际上,我正在尝试创建一个进程监控器功能来监视所有进程的内存和CPU使用情况。

您应该为此查看psutil模块。

如果您只想在内存消耗很高的情况下挂起(而不是终止)进程,则可以从我的回答here中得到一些启发。

答案 2 :(得分:-2)

terminate()进程不允许重新启动该进程,但是可以使用kill()进程,并且可以重新启动该进程。它有效

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.kill()
print "after kill"
time.sleep(3)


p1.start()