Python 多进程中守护进程的创建与行为解析
本文通过具体代码示例,详解 Python 中如何设置守护进程。重点分析当子进程被标记为守护进程(daemon=True)时,若主进程提前结束,未完成的子进程将被强制终止的行为机制。通过对比不同守护进程设置下的输出结果,帮助开发者理解进程同步与生命周期管理的关键差异。
守护进程概述
在前一篇文章中,我们探讨了 join() 方法在多进程编程中的作用。本文将进一步深入,讲解如何设置守护进程及其对程序运行的具体影响。(注:熟悉 Python 高级并发编程的专家可跳过此部分)
守护进程行为示例
为了直观展示守护进程的行为,我们准备两个具体的代码案例进行说明。
# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/7/30 11:20 AM
func:
"""
from multiprocessing import Process
import os
import time
def now():
return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
def func_1(name):
print(now() + ' Run child process %s ,pid is %s...' % (name, os.getpid()))
time.sleep(2)
print(now() + ' Stop child process %s ,pid is %s...' % (name, os.getpid()))
def func_2(name):
print(now() + ' Run child process %s , pid is %s...' % (name, os.getpid()))
time.sleep(4)
print(now() + ' hello world!')
print(now() + ' Stop child process %s , pid is %s...' % (name, os.getpid()))
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p1.daemon = True #设置子进程p1为守护线程
p1.start()
p2.start()
print now() + ' Process end .'
首先观察第一个案例的运行结果。

从输出日志可以看到,子进程 func_1 成功启动并打印了开始运行的信息,但并未出现结束运行的提示。这是因为随着主进程的结束,作为守护进程的 func_1 也随之被强制终止,导致其清理代码未被执行。
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p2.daemon = True #设置子进程p2为守护线程
p1.start()
p2.start()
print now() + ' Process end .'
接着查看第二个案例的运行结果。

在此案例中,func_1 正常启动并运行,而 func_2 因被设置为守护进程,在主进程结束前尚未启动或正在执行时,便随着主进程的退出而被强制终止。
守护进程机制总结
基于上述现象,我们进行总结。
对进程或子线程调用 join() 方法,意味着当前程序必须等待该子进程或子线程执行完毕才能继续。当主进程(或主线程)创建多个子线程并各自独立执行时,若主进程试图退出,默认会检查子线程是否结束。然而,如果我们将子进程的 daemon 属性设置为 True,无论子进程是否执行完毕,它都将在主进程结束时被强制终止,与主进程一同退出。
- 文章结束 -
以上是关于 Python 如何设置守护进程的详细内容。如需了解更多 Python 守护进程相关的技术资料,请持续关注本站的其他相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













