python3 多进程编程(一)

本文深入解析基于fork的多进程编程,探讨进程的运行特征、fork函数的使用及进程相关函数,如getpid、getppid和_exit。同时,文章详细阐述了孤儿进程和僵尸进程的概念,以及如何避免僵尸进程的产生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基于fork的多进程编程
    依赖于接口、函数来进行多进程编程
    1.进程的运行特征
        【1】进程可以使用计算机的多核资源。
        【2】进程是计算机分配资源的最小单位。(一个进程包含多个线程,但是资源是不会分配给线程的,只会分配给进程,线程再向进程申请资源)
        【3】进程之间的运行互相不影响,各自独立。
        【4】每个进程拥有独立的空间,各自使用自己空间资源。(每个进程会被分配4个G的虚拟内存空间,即只对进程分配一小块物理内存,然后扩展到虚拟内存空间。win下叫虚拟内存,linux下叫交换分区)

    2.fork使用
        pid = os.fork()
        功能:创建新的进程
        参数:无
        返回值:整数,如果传集创建进程失败则返回负数,如果成功则在原有进程中返回新进程的PID,在新进程中返回0
        注意:
            *子进程会复制父进程全部内存空间,从fork下一句开始执行
            *父子进程各自独立运行,运行顺序不一定
            *利用父子进程fork返回值的区别,配合if结构让父子进程执行不同的内容,几乎是固定搭配
            *父子进程有各自特有特征,比如PID PCB 命令集等。
            *父进程fork之前开辟的空间,子进程同样拥有,父子进程对各自空间的操作不会互相影响。

二、进程相关函数
    1.os.getpid()
        功能:获取进程pid 值
        参数:无
        返回值:返回当前进程的PID值

    2.os.getppid()
    功能:获取父进程的PID号
    参数:无
    返回值:返回父进程的PID

    3.os._exit(status)
    功能:结束一个进程
    参数:进程的终止状态(整数,1表示进程以状态1终止,2表示以状态2终止,数字原始没有任何含义,需要赋予含义,可以不赋予含义)

    4.sys.exit([status]) #os是通用接口,
        功能:退出进程
        参数:
            整数 退出状态
            字符串 退出时打印的内容

三、孤儿和僵尸
    1.孤儿进程:父进程先于子进程退出,此时子进程成为孤儿进程。 孤儿进程会被操作系统分配的固有进程收养,此时子进程会被改变。
        特点:孤儿进程会被系统进程收养,此时系统进程就被称为孤儿进程新的父进程。孤儿进程不会成为僵尸进程,因为孤儿进程退出,新的父进程会自动处理。

    2.僵尸进程:子进程先于父进程退出,如果父进程又没有处理子进程的退出状态,此时子进程则会变成僵尸进程。
        特点:僵尸进程,虽然结束,但是会存留部分PCB在内存中,大量的僵尸进程会浪费系统的内存资源

    3.如何避免僵尸进程产生:
        【1】使用wait函数处理子进程退出。
            pid,status = os.wait()
            功能:在父进程中阻塞等待处理子进程的退出
            返回值:
                pid   退出的子进程PID
                status   子进程退出状态

            pid,status = os.waitpid(pid,option)
            功能:在父进程中处理子进程退出状态
            参数:
                pid 
                    负数、0或大于0的数都可以,一般写-1 表示等待任意子进程退出
                    >0 表示等待指定的子进程退出
                option 
                    0 表示阻塞等待
                    os.WNOHANG 表示非阻塞
            返回值:
                pid: 退出的子进程PID
                status: 子进程退出状态
            传0,1就和wait一样了


        【2】创建二级子进程处理僵尸
            1.父进程创建子进程,等待回收子进程
            2.子进程创建二级子进程然后退出
            3.二级子进程成为孤儿,和原来父进程一同执行事件


        【3】通过信号处理子进程退出
            原理:子进程退出时会发送信号给父进程,如果父进程忽略子进程信号,则系统会自动处理子进程退出。
            方法:使用singnal模块在父进程创建子进程前写如下语句:
                import signal
                signal.signal(signal.SIGCHLD,signal.SIG_IGN)
            优点:
                *非阻塞,不会影响父进程进行
                *使用该方法,父进程可以处理所有子进程退出

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值