第十章:使用进程、线程和协程提供并发性-multiprocessing:像线程一样管理进程-守护进程

10.4.4 守护进程
默认地,在所有子进程退出之前主程序不会退出。有些情况下,可能需要启动一个后台进程,它可以一直运行而不阻塞主程序退出,如果一个服务无法用一种容易的方法中断进程,或者希望进程工作到一半时中止而不损失或破坏数据(例如为一个服务监控工具生成“心跳”的任务),那么对于这些服务,使用守护进程就很有用。
要标志一个进程为守护进程,可以将其daemon属性设置为True。默认情况下进程不作为守护进程。

import multiprocessing
import time
import sys

def daemon():
    p = multiprocessing.current_process()
    print('Starting:',p.name,p.pid)
    sys.stdout.flush()
    time.sleep(2)
    print('Exiting :',p.name,p.pid)
    sys.stdout.flush()

def non_daemon():
    p = multiprocessing.current_process()
    print('Starting:',p.name,p.pid)
    sys.stdout.flush()
    print('Exiting :',p.name,p.pid)
    sys.stdout.flush()

if __name__ == '__main__':
    d = multiprocessing.Process(
        name='daemon',
        target=daemon,
        )
    d.daemon = True

    n = multiprocessing.Process(
        name='non-daemon',
        target=non_daemon,
        )

    d.start()
    time.sleep(1)
    n.start()

输出中没有守护进程的“Exiting”消息,因为在守护进程从其2秒的睡眠时间唤醒之前,所有非守护进程(包括主程序)已经退出。
运行结果:
在这里插入图片描述

守护进程会在主程序退出之前自动终止,以避免留下“孤”进程继续运行。要验证这一点,可以查找程序运行时打印的进程ID值,然后用一个类似ps的命令检查该进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值