python中多进程应用及僵尸进程、孤儿进程
一、python如何使用多进程
创建子进程的方式
1.导入multiprocessing 中的Process类 实例化这个类 指定要执行的任务 target
import os
from multiprocessing import Process
"""
Process 就表示进程
为什么要开进程
"""
def task():
print("this is sub process")
print("sub process id %s" % os.getpid())
if __name__ == '__main__':
# ######注意 开启进程的代码必须放在 ————main————判断下面
# 实例化一个进程对象 并制定他要做的事情 用函数来指定
p = Process(target=task)
p.start() # 给操作系统发送消息 让它开启进程
print("this is parent process")
print("parent process is: %s" % os.getpid())
print("over")
linux 与windows开启进程的方式不同
linux 会将父进程的内存数据 完整copy一份给子进程
注意:
windows 会导入父进程的代码 从头执行一遍 来获取需要处理的任务
所以在编写代码时如果是windows一定要将开启进程的代码放main判断中
linux 可以不放
2.导入multiprocessing 中的Process类 继承这个类 覆盖run方法 将要执行的任务放入run中开启进程时会自动执行该函数
from multiprocessing import Process
import os
class Downloader(Process):
# def __init__(self,url,size,name):
# super().__init__()
# self.url = url
# self.size = size
# self.name = name
def run(self):
print(os.getpid())
pass
if __name__ == '__main__':
m = Downloader()
m.start()
print("parent over",os.getpid())
如果需要对进程对象进行高度自定义那就可以继承它
进程之间内存相互隔离
from multiprocessing import Process
import os,time
a = 257
def task():
global a
# print("2",a,id(a))
a = 200
if __name__ == '__main__':
p = Process(target=task)
p.start() # 向操作系统发送指令
time.sleep(4)
print(a)
join函数
from multiprocessing import Process
import time
def task1(name):
for i in range(10000):
print("%s run" % name)
def task2(name):
for i in range(100):
print("%s run" % name)
if __name__ == '__main__': # args 是给子进程传递的参数 必须是元组
p1 = Process(target=task1,args=("p1",))
p1.start() # 向操作系统发送指令
# p1.join() # 让主进程 等待子进程执行完毕在继续执行
p2 = Process(target=task2,args=("p2",))
p2.start() # 向操作系统发送指令
p2.join() # 让主进程 等待子进程执行完毕在继续执行
p1.join()
#需要达到的效果是 必须保证两个子进程是并发执行的 并且 over一定是在所有任务执行完毕后执行
print("over")
案例:
# join的使用
from multiprocessing import Process
import time
def task1(name):
for i in range(10):
print("%s run" % name)
if __name__ == '__main__': # args 是给子进程传递的参数 必须是元组
ps = []
for i in range(10):
p = Process(target=task1,args=(i,))
p.start()
ps.append(p)
# 挨个join以下
for i in ps:
i.join()
print("over")
二、僵尸进程与孤儿进程
孤儿进程 当父进程已经结束 而子进程还在运行 子进程就称为孤儿进程 尤其存在的必要性,没有不良影响
僵尸进程 当一个进程已经结束了但是,它仍然还有一些数据存在 此时称之为僵尸进程
在linux中,有这么一个机制,父进程无论什么时候都可以获取到子进程的的 一些数据
子进程 任务执行完毕后,确实结束了但是仍然保留一些数据 目的是为了让父进程能够获取这些信息
linux中 可以调用waitpid来是彻底清除子进程的残留信息
python中 已经封装了处理僵尸进程的操作 ,无需关心