Chinaunix首页 | 论坛 | 博客
  • 博客访问: 328804
  • 博文数量: 32
  • 博客积分: 822
  • 博客等级: 准尉
  • 技术积分: 388
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-27 13:55
文章分类

全部博文(32)

文章存档

2019年(2)

2017年(4)

2016年(9)

2015年(1)

2014年(1)

2012年(2)

2011年(13)

我的朋友

分类: Python/Ruby

2016-05-21 19:00:06

运用场景:
        测试了一下Python的进程池的用法,发现当脚本反复运行退出多次后,进程池开启的子进程有一个会处于不工作的状态,余下的可以正常工作,不清楚是不是自己没有处理好。另外一个就是在信号处理的时候也比较麻烦,不能达到我想要的效果(可能是我刚接触Python不久,很多模块的功能不清楚的原因)
        我想要的效果是,可以同时开启多个常驻进程,进程会进入一个循环,一直在处理任务,当某个子进程异常退出后,父进程能监听退出进程的状态,并且立即开启新的子进程补全,当主进程退出时,先杀死所有的子进程,再自己本身退出,以下是代码(CP网友的小例子进程修改), 退出操作是通过信息来控制。

点击(此处)折叠或打开

  1. #coding:utf-8
  2. from multiprocessing import Process
  3. import sys, os
  4. import time
  5. import signal

  6. reload(sys)
  7. sys.setdefaultencoding("utf-8")
  8. PID_LIST = []

  9. def timetask(times):
  10.     time.sleep(times)
  11.     while True:
  12.         time.sleep(20000)

  13. def works(func, arg, worknum):
  14.     proc_record = []
  15.     PID_LIST.append(os.getpid())
  16.     for i in range(worknum):
  17.         p = Process(target = func, args = (arg,))
  18.         p.start()
  19.         PID_LIST.append(p.pid)
  20.         proc_record.append(p)
  21.     while True:
  22.         for p in proc_record:
  23.             check = p.join(timeout=0.5)
  24.             if check == None:
  25.                 if p.is_alive():
  26.                     pass
  27.                 else:
  28.                     PID_LIST.remove(p.pid)
  29.                     proc_record.remove(p)
  30.                     p = Process(target = func, args = (arg,))
  31.                     p.start()
  32.                     PID_LIST.append(p.pid)
  33.                     proc_record.append(p)


  34. def myHandler(signum, frame):
  35.     global PID_LIST
  36.     print('recevice single: ' + str(signum) + " " + str(os.getpid()))
  37.     print PID_LIST
  38.     if os.getpid() in PID_LIST:
  39.         print u'我是父亲。。'
  40.         PID_LIST.remove(os.getpid())
  41.         for pid in PID_LIST:
  42.             os.kill(pid, signal.SIGTERM)
  43.         sys.exit(0)
  44.     else:
  45.         print u'我是小鬼。。'
  46.         sys.exit(0)

  47. signal.signal(signal.SIGHUP, myHandler) # 1
  48. signal.signal(signal.SIGINT, myHandler) # 2
  49. signal.signal(signal.SIGQUIT, myHandler) # 3
  50. signal.signal(signal.SIGALRM, myHandler) # 14
  51. signal.signal(signal.SIGTERM, myHandler) # 15
  52. signal.signal(signal.SIGCONT, myHandler) # 18
  53. if __name__ == '__main__':
  54.     arg = 5
  55.     procs = 4
  56.     works(timetask, arg, procs)

执行效果如下:
杀死主进程时:

点击(此处)折叠或打开

  1. [root@fj share]# python sub.py
  2. recevice single: 3 3070
  3. [3068, 3069]
  4. 我是小鬼。。
  5. recevice single: 3 3068
  6. [3068, 3069, 3071, 3072, 3074]
  7. 我是父亲。。
  8. recevice single: 15 3069
  9. [3068]
  10. 我是小鬼。。
  11. recevice single: 15 3071
  12. [3068, 3069, 3070]
  13. 我是小鬼。。
  14. recevice single: 15 3072
  15. [3068, 3069, 3070, 3071]
  16. 我是小鬼。。
  17. recevice single: 15 3074
  18. [3068, 3069, 3071, 3072]
  19. 我是小鬼。。
杀死子进程时:

点击(此处)折叠或打开

  1. [root@fj share]# python sub.py
  2. recevice single: 15 3079
  3. [3078]
  4. 我是小鬼。。



阅读(2768) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~