进程创建&僵尸进程&孤儿进程

南楼画角 提交于 2019-11-29 19:21:01

一、创建并开启子进程的两种方式

1.1方式一

#单个进程
from multiprocessing import Process
import time

def Text():
    print('我是一个子进程')
    print('我的进程开始了')
    time.sleep(2)
    print('我的进程结束了')


if __name__ == '__main__':  #windows下必须要写这一句,不然会报错
    p = Process(target = Text)   #实例化产生一个对象
    p.start()   # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子,开多长时间跟你没关系
    time.sleep(5)
    print('我是主进程,我要结束了')
#多个进程
from multiprocessing import Process
import time

def Text(x):
    print(f'我是子进程{x}')
    print(f'{x}的进程开始了')
    time.sleep(2)
    print(f'{x}的进程结束了')


if __name__ == '__main__':  #windows下必须要写这一句,不然会报错
    p1 = Process(target = Text,args=('yjy',))   #实例化产生一个对象  子进程1
    p2 = Process(target = Text,args=('ypp',))   #实例化产生一个对象  子进程2
    p1.start()   # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子,开多长时间跟你没关系
    p2.start()   # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子,开多长时间跟你没关系
    time.sleep(5)
    print('我是主进程,我要结束了')

1.2 方式二

from  multiprocessing import Process
import time

class Text(Process):  #定义一个类,让他继承Process
    def __init__(self,name):    #重写__init__
        super().__init__()   #继承父类的__init__方法
        self.name = name

    def run(self):  #定义一个函数
        print(f'子进程的姓名为{self.name},子进程开始')
        time.sleep(2)
        print(f'{self.name}进程结束')


if __name__ == '__main__':
    p = Text('yjy')
    p.start()  #通知操作系统子进程开始
    print('主进程结束')

二、验证进程的内存空间隔离


from multiprocessing import Process
import time

x = 0  #定义一个变量x
def Check():
    global x
    x = 100
    print(f'子进程的x:{x}')


if __name__ == '__main__':
    p = Process(target=Check)
    p.start()
    print(f'父进程的x:{x}')
   
-----------------------------------------------------------------------------------
父进程的x:0
子进程的x:100

父进程的x和子进程的x不是一个值,说明他们两个进程互不影响!

三、僵尸进程与孤儿进程


僵尸进程(有害):当子进程结束的时候,不会将所有内容都释放掉,他会留下自己的pid(类似身份证号码)供父进程来查看,此所谓进程死了没死干净,这就是僵尸进程,他会等待父进程最后把他处理掉

孤儿进程(无害):一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

1.1方式一

#单个进程
from multiprocessing import Process
import time

def Text():
    print('我是一个子进程')
    print('我的进程开始了')
    time.sleep(2)
    print('我的进程结束了')


if __name__ == '__main__':  #windows下必须要写这一句,不然会报错
    p = Process(target = Text)   #实例化产生一个对象
    p.start()   # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子,开多长时间跟你没关系
    time.sleep(5)
    print('我是主进程,我要结束了')
#多个进程
from multiprocessing import Process
import time

def Text(x):
    print(f'我是子进程{x}')
    print(f'{x}的进程开始了')
    time.sleep(2)
    print(f'{x}的进程结束了')


if __name__ == '__main__':  #windows下必须要写这一句,不然会报错
    p1 = Process(target = Text,args=('yjy',))   #实例化产生一个对象  子进程1
    p2 = Process(target = Text,args=('ypp',))   #实例化产生一个对象  子进程2
    p1.start()   # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子,开多长时间跟你没关系
    p2.start()   # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子,开多长时间跟你没关系
    time.sleep(5)
    print('我是主进程,我要结束了')

1.2 方式二

from  multiprocessing import Process
import time

class Text(Process):  #定义一个类,让他继承Process
    def __init__(self,name):    #重写__init__
        super().__init__()   #继承父类的__init__方法
        self.name = name

    def run(self):  #定义一个函数
        print(f'子进程的姓名为{self.name},子进程开始')
        time.sleep(2)
        print(f'{self.name}进程结束')


if __name__ == '__main__':
    p = Text('yjy')
    p.start()  #通知操作系统子进程开始
    print('主进程结束')

二、验证进程的内存空间隔离


from multiprocessing import Process
import time

x = 0  #定义一个变量x
def Check():
    global x
    x = 100
    print(f'子进程的x:{x}')


if __name__ == '__main__':
    p = Process(target=Check)
    p.start()
    print(f'父进程的x:{x}')
   
-----------------------------------------------------------------------------------
父进程的x:0
子进程的x:100

父进程的x和子进程的x不是一个值,说明他们两个进程互不影响!

三、僵尸进程与孤儿进程


僵尸进程(有害):当子进程结束的时候,不会将所有内容都释放掉,他会留下自己的pid(类似身份证号码)供父进程来查看,此所谓进程死了没死干净,这就是僵尸进程,他会等待父进程最后把他处理掉

孤儿进程(无害):一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!