python 如何优雅地退出子进程
python 如何优雅地退出子进程
主进程产生子进程,子进程进入永久循环模式。当主进程要求子进程退出时,如何能安全地退出子进程呢?
参考一些代码,我写了这个例子。运行之后,用kill pid试试。pid是主进程的pid。当然子进程的也没问题。
1)如果kill pid为子进程的pid,当所有子进程都kill掉了,主进程就关闭了。这也是我们想要的结果。
2)如果kill pid为主进程的pid,主进程向子进程发送退出信号,然后等全部子进程关闭后退出。
保证了主进程在所有子进程退出之后退出。
#-*- coding: UTF-8 -*- # graceful_exit_event.py # UTF-8 without BOM # # refer: # http://stackoverflow.com/questions/26414704/how-does-a-python-process-exit-gracefully-after-receiving-sigterm-while-waiting?rq=1 # http://www.cnblogs.com/kaituorensheng/p/4445418.html # init created: 2016-07-13 # last updated: 2016-07-14 # ####################################################################### import os import signal import multiprocessing class GracefulExitException(Exception): @staticmethod def sigterm_handler(signum, frame): raise GracefulExitException() pass class GracefulExitEvent(object): def __init__(self): self.workers = [] self.exit_event = multiprocessing.Event() # Use signal handler to throw exception which can be caught # by worker process to allow graceful exit. signal.signal(signal.SIGTERM, GracefulExitException.sigterm_handler) pass def reg_worker(self, wp): self.workers.append(wp) pass def is_stop(self): return self.exit_event.is_set() def notify_stop(self): self.exit_event.set() def wait_all(self): while True: try: for wp in self.workers: wp.join() print "main process(%d) exit." % os.getpid() break except GracefulExitException: self.notify_stop() print "main process(%d) got GracefulExitException." % os.getpid() except Exception, ex: self.notify_stop() print "main process(%d) got unexpected Exception: %r" % (os.getpid(), ex) break pass ####################################################################### def worker_proc(gee): import sys, time print "worker(%d) start ..." % os.getpid() try: while not gee.is_stop(): # do task job here print ".", time.sleep(1) else: print "" print "worker process(%d) got exit event." % os.getpid() print "worker process(%d) do cleanup..." % os.getpid() time.sleep(1) print "[%d] 3" % os.getpid() time.sleep(1) print "[%d] 2" % os.getpid() time.sleep(1) print "[%d] 1" % os.getpid() except GracefulExitException: print "worker(%d) got GracefulExitException" % os.getpid() except Exception, ex: print "Exception:", ex finally: print "worker(%d) exit." % os.getpid() sys.exit(0) if __name__ == "__main__": import sys print "main process(%d) start" % os.getpid() gee = GracefulExitEvent() # Start some workers process and run forever for i in range(0, 10): wp = multiprocessing.Process(target=worker_proc, args=(gee,)) wp.start() gee.reg_worker(wp) gee.wait_all() sys.exit(0)
需要说明的是:
如果某个进程接受 kill pid,必须在该进程函数的最外层捕获: except GracefulExitException,
同时该进程函数内部调用捕获了 except Excetion,则必须在之前捕获GracefulExitException,
即:
(2) 必须在(3)之前。否则同时去掉(2)和(3)。
def do_some_func(): try: time.sleep(10) blablabla (1) except SomeError: # 捕获特定的异常 pass (2) except GracefulExitException: # 接收 kill pid pass (3) except: # 不建议捕获默认异常, 否则必须在此之前捕获:GracefulExitException pass def some_process_main(gee): try: while not gee.is_stop(): do_some_func() except GracefulExitException: # 接收到了 kill pid, 设置中止循环 gee.notify_stop() pass except: pass
python 如何优雅地退出子进程的更多相关文章
- 如何优雅地退出python程序
如何优雅地退出python程序 一个单模的python程序,启动之后要能够优雅地关闭.即当用户按Ctrl+C或者kill pid的时候,程序都能从容关闭.实现起来非常简单. is_running = ...
- 情景linux--如何优雅地退出telnet
情景linux--在脚本中如何优雅地退出telnet 情景 telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式.虽然telnet支持许多命令,但大部分情况下,我们只是使用 ...
- C# Note11:如何优雅地退出WPF应用程序
前言 I should know how I am supposed to exit my application when the user clicks on the Exit menu item ...
- 从nsq中学习如何优雅的退出go 网络程序
退出运行中的程序,可以粗暴的kill -9 $PID,但这样会破坏业务的完整性,有可能一个正在在执行的逻辑半途而费,从而产生不正常的垃圾数据. 本文总结在go语言中,如何能优雅的退出网络应用,涉及的知 ...
- 如何优雅的退出/关闭/重启gunicorn进程
在工作中,会发现gunicorn启动的web服务,无论怎么使用kill -9 进程号都是无法杀死gunicorn,经过我一番百度和谷歌,发现想要删除gunicorn进程其实很简单. 1. 寻找mast ...
- 【Golang】程序如何优雅的退出?
1. 背景 项目开发过程中,随着需求的迭代,代码的发布会频繁进行,在发布过程中,如何让程序做到优雅的退出? 为什么需要优雅的退出? 你的 http 服务,监听端口没有关闭,客户的请求发过来了,但处理了 ...
- 让Python更优雅更易读(第二集)
友情链接 让Python更优雅更易读(第一集) 1.装饰器 1.1装饰器特别适合用来实现以下功能 运行时校验:在执行阶段进行特定校验,当校验通不过时终止执行. 适合原因:装饰器可以方便地在函数执行前介 ...
- [转载]Python模块学习 ---- subprocess 创建子进程
[转自]http://blog.sciencenet.cn/blog-600900-499638.html 最近,我们老大要我写一个守护者程序,对服务器进程进行守护.如果服务器不幸挂掉了,守护者能即时 ...
- 一个Python中优雅的数据分块方法
背景 看到这个标题你可能想一个分块能有什么难度?还值得细说吗,最近确实遇到一个有意思的分块函数,写法比较巧妙优雅,所以写一个分享. 日前在做需求过程中有一个对大量数据分块处理的场景,具体来说就是几十万 ...
随机推荐
- Shell编程-项目部署(一)
由于实际工作中经常用到需要部署项目,比较麻烦,今天记录下如何利用shell脚本完成自动部署的工作,毕竟不是专业的运维出身,写的不好,还请勿喷_^o^_ 今天以部署Django项目为演示,进行部署项目, ...
- [SHOI2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
- 【HNOI2017】大佬
题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...
- bzoj2339[HNOI2011]卡农 dp+容斥
2339: [HNOI2011]卡农 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 842 Solved: 510[Submit][Status][ ...
- 【完整项目】使用Scrapy模拟HTTP POST,获取完美名字
1. 背景 最近有人委托我给小孩起个名字,说名字最好符合周易五行生克理论,然后给了我个网址,说像是这个网站中的八字测名,输入名字和生辰八字等信息,会给出来这个名字的分数和对未来人生的预测.当父母的自然 ...
- Calendar 时间日历简单例子
直接上代码: 运行结果:
- 非Unicode编码的软件如何在Windows系统上运行
我们常常会遇到这样一种情况:点开某些日文软件(我不会说就是galgame( ╯□╰ ))会出现乱码或者直接无法运行. 出现乱码的原因很简单:编码与译码的方式不一致!!!!!!!!!!! 首先大家需要知 ...
- SSD-Tensorflow: 3 步运行 TensorFlow 单图片多盒目标检测器
昨天类似的 YOLO: https://www.v2ex.com/t/392671#reply0 下载这个项目 https://github.com/balancap/SSD-Tensorflow 解 ...
- PySC2是DeepMind的“星际争霸II学习环境”(SC2LE)的Python组件
PySC2是DeepMind的"星际争霸II学习环境"(SC2LE)的Python组件. 它暴露了暴雪娱乐公司的星际争霸II机器学习API作为Python RL环境. 这是Deep ...
- 关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考
原文链接 http://blog.csdn.net/voo00oov/article/details/50433672 java中interface中定义变量都是"public static ...