进程类的简单使用
1、 多进程启动的方法一 在Windows操作系统下
# from multiprocessing import Process
# import time
#
# def task(msg, n):
# print('进程 %s runnin'%msg)
# time.sleep(n)
# print('进程 %s downing ' % msg)
#
# if __name__ == '__main__':
#
# # Process是类名,要进行实例化对象 进程,
# # 进程对象需要参数属性,一个是任务名称和任务所需要的传参
# # 传参有args 是以位置传参的方式进行 就是数据体是元组的,元素是字符串
# # 传参有kwargs 是以有关键字传参 ,数据体是字典 ,
# p1 = Process(target=task,args=('1',2))
# p2 = Process(target=task,kwargs={'msg':'2','n':5})
# p1.start()
# p2.start()
#
# print('主 进程 running ')
2、多进程启动的方法二 (在Windows操作系统下)
# from multiprocessing import Process
# import time
#
#
# # p1 = Process(target=task, args=('1', 2))
# # p2 = Process(target=task, kwargs={'msg': '2', 'n': 5})
#
# # 采用封装成自己的类名
#
# class MyProcess(Process):
# '''
# 继承进程的父类初始化init函数
# '''
# def __init__(self,msg,n):
# '''
# 先进行父类的初始化,把发送给操作系统创建进程的数据完成
# 实例化任务对象,同时把对象的属性参数传进来
# :param msg:
# :param n:
# '''
# super().__init__()
# self.msg = msg
# self.n = n
#
# def run(self) -> None:
# print('进程 %s runnin' % self.msg)
# time.sleep(self.n)
# print('进程 %s downing ' % self.msg)
#
#
#
#
# if __name__ == '__main__':
# p1 = MyProcess(msg='子进程1',n=4)
# # 实例化对象 拿到对象的句柄
# p2 = MyProcess(msg='子进程2',n=3)
# p1.start()
# # 执行句柄的功能,为什么是start功能,不是run函数
# # ,是因为要使用父类的功能start 发送创建进程的信号。这也是为甚么要初始化父类
# p2.start()
#
# print('主 进程 running ')
3、进程对象的方法 join
#
from multiprocessing import Process
import time
def task(msg, n):
print('进程 %s runnin'%msg)
time.sleep(n)
print('进程 %s downing ' % msg)
if __name__ == '__main__':
p1 = Process(target=task, args=('1', 2))
p2 = Process(target=task,kwargs={'msg':'2','n':5})
# p1.start()
# p1.join() # 子进程开启,并运行结束后,才继续运行其他代码
#
# p2.start()
# p2.join() # 子进程开启,并运行结束后,才继续运行其他代码
# print('主 进程 running ')
# 从现象看 程序是串行的
p1.start()
p2.start()
# 现在的排布是子进程是并发的,同时发出了创建进行的指令,
p1.join()
p2.join()
# join 的功能只能对主进程和 在其后的子进程影响 ,进程的执行是被操作系统接管了。
# join的底层机制,简单讲就是不断的向操作系统进行询问子进程是否结束,如果结束就解锁进程。
# 为甚么要用join ,就是为了能加快子进程运行完成后,快速的进行主进程的功能计算,没有join的功能,无法预测子进程的时间运行时间,导致代码不够优化。
print('主 进程 running ')
4、 僵尸进程 和 孤儿进程 (unix系统)
# 僵尸进程 :
# 形成原因是 父进程创建子进程,父进程需要获取到子进程信息,所以会保留子进程的相关信息,这个子进程就是僵尸进程
# 解决 主进程在子进程运行完成后,即时使用join 进行资源回收。
# 孤儿进程 形成原因 父进程被被 kill ,子进程还活着,最后由init进程接管