运用场景:
测试了一下Python的进程池的用法,发现当脚本反复运行退出多次后,进程池开启的子进程有一个会处于不工作的状态,余下的可以正常工作,不清楚是不是自己没有处理好。另外一个就是在信号处理的时候也比较麻烦,不能达到我想要的效果(可能是我刚接触Python不久,很多模块的功能不清楚的原因)
我想要的效果是,可以同时开启多个常驻进程,进程会进入一个循环,一直在处理任务,当某个子进程异常退出后,父进程能监听退出进程的状态,并且立即开启新的子进程补全,当主进程退出时,先杀死所有的子进程,再自己本身退出,以下是代码(CP网友的小例子进程修改), 退出操作是通过信息来控制。
-
#coding:utf-8
-
from multiprocessing import Process
-
import sys, os
-
import time
-
import signal
-
-
reload(sys)
-
sys.setdefaultencoding("utf-8")
-
PID_LIST = []
-
-
def timetask(times):
-
time.sleep(times)
-
while True:
-
time.sleep(20000)
-
-
def works(func, arg, worknum):
-
proc_record = []
-
PID_LIST.append(os.getpid())
-
for i in range(worknum):
-
p = Process(target = func, args = (arg,))
-
p.start()
-
PID_LIST.append(p.pid)
-
proc_record.append(p)
-
while True:
-
for p in proc_record:
-
check = p.join(timeout=0.5)
-
if check == None:
-
if p.is_alive():
-
pass
-
else:
-
PID_LIST.remove(p.pid)
-
proc_record.remove(p)
-
p = Process(target = func, args = (arg,))
-
p.start()
-
PID_LIST.append(p.pid)
-
proc_record.append(p)
-
-
-
def myHandler(signum, frame):
-
global PID_LIST
-
print('recevice single: ' + str(signum) + " " + str(os.getpid()))
-
print PID_LIST
-
if os.getpid() in PID_LIST:
-
print u'我是父亲。。'
-
PID_LIST.remove(os.getpid())
-
for pid in PID_LIST:
-
os.kill(pid, signal.SIGTERM)
-
sys.exit(0)
-
else:
-
print u'我是小鬼。。'
-
sys.exit(0)
-
-
signal.signal(signal.SIGHUP, myHandler) # 1
-
signal.signal(signal.SIGINT, myHandler) # 2
-
signal.signal(signal.SIGQUIT, myHandler) # 3
-
signal.signal(signal.SIGALRM, myHandler) # 14
-
signal.signal(signal.SIGTERM, myHandler) # 15
-
signal.signal(signal.SIGCONT, myHandler) # 18
-
if __name__ == '__main__':
-
arg = 5
-
procs = 4
-
works(timetask, arg, procs)
执行效果如下:
杀死主进程时:
-
[root@fj share]# python sub.py
-
recevice single: 3 3070
-
[3068, 3069]
-
我是小鬼。。
-
recevice single: 3 3068
-
[3068, 3069, 3071, 3072, 3074]
-
我是父亲。。
-
recevice single: 15 3069
-
[3068]
-
我是小鬼。。
-
recevice single: 15 3071
-
[3068, 3069, 3070]
-
我是小鬼。。
-
recevice single: 15 3072
-
[3068, 3069, 3070, 3071]
-
我是小鬼。。
-
recevice single: 15 3074
-
[3068, 3069, 3071, 3072]
-
我是小鬼。。
杀死子进程时:
-
[root@fj share]# python sub.py
-
recevice single: 15 3079
-
[3078]
-
我是小鬼。。
阅读(2812) | 评论(0) | 转发(0) |