我正在尝试使用多处理模块重新启动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使用率。如果达到一定水平,我想实时重启
答案 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()