Python中multiprocessing.Pool进程池实现守护进程的方法

前言

在multiprocessing.Process中可以使用p.daemon=True将子进程p设置为守护进程。
那么在multiprocessing.Pool进程池中怎么实现这个功能呢?


什么是守护进程

将子进程设置为守护进程后,若父进程退出则子进程也退出。防止产生僵尸进程。

比如下面就产生了僵尸进程。而且烦人的是,这几个僵尸进程的PID还会变,这让我怎么杀???


什么是multiprocessing.Pool进程池

下面我通过一个简单的教程来说明一下怎么使用进程池。
注意:这个模块只能在Linux中使用,具体原因可以查看http://1t.click/KzV中关于fork()的解释。

from multiprocessing import Pool		#导入模块
def run_proc(name):		#子进程要执行的代码
	...					#省略此处代码
p = Pool(4)		#最多同时执行4个进程(一般为CPU核数),有进程运行完腾出的空间再分配给其他进程运行
for i in range(5):
	p.apply_async(run_proc, args=(i,))	#在进程池中添加进程
p.close()		#执行join()前必须执行close(),表示不能继续添加新的进程了
p.join()		#等待子进程结束再往下执行

multiprocessing.Pool如何实现守护进程?

换句话说:主进程退出后(如Ctrl+C退出)怎么自动停止子进程?

我们可以通过异常处理的方式,停止进程池中的所有进程来实现

try:
	p = Pool(4)		#最多同时执行4个进程(一般为CPU核数),有进程运行完腾出的空间再分配给其他进程运行
	for i in range(5):
		p.apply_async(run_proc, args=(i,))	#在进程池中添加进程
	p.close()		#执行join()前必须执行close(),表示不能继续添加新的进程了
	p.join()		#等待子进程结束再往下执行
except:
	p.terminate()	#这里的意思是停止进程池中的所有进程

现在的代码就可以完美通过Ctrl+C退出啦。


发布了99 篇原创文章 · 获赞 44 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/NetRookieX/article/details/99821399