使用multiprocessing模块创建子进程有两种方法
1.用Process类创建子进程对象,然后用start()方法调用
from multiprocessing import Process import time def task(): print('son run') time.sleep(5) print('son over') if __name__ == '__main__': p=Process(target=task) 创建子进程对象参数target=函数名 time.sleep(1) p.start() 调用子进程对象 time.sleep(2) print('over')
==》son run
over
son over
2.创建父类为Process的类,在自定义的类中创建一个run方法,生成自定义类的对象为进程对象
class Myprocess(Process): def __init__(self,name,s): 需要传入的参数可以根据需求设置 super().__init__() self.name=name self.s=s def run(self): run方法会自动被作为进程程序调用 print('%s run'%self.name) time.sleep(self.s) print('%s over'%self.name) if __name__ == '__main__': p=Myprocess('aaa',1) p1=Myprocess('bbb',3) p.start() p1.start()
==》bbb run
aaa run
aaa over
bbb over
注意
运行子进程需要在if __name__ == '__main__':包裹下才能正常运行
创建的进程必须通过start方法来调用才会开始运行,也就是说子啊不被调用的情况下就
不会被执行
进程内存相互隔离
父进程和子进程在运行中内存是被隔离开的,不同的进程在运行时会被放在单独的内存中空间中运行
n=10 def fun(): n=0 print('son:n=%s'%n) if __name__ == '__main__': p=Process(target=fun) print('far:n=%s'%n) p.start()
==》far:n=10
son:n=0
Prscess常用方法和属性
p.join() 用来等待子进程结束
class Myprocess(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s run'%self.name) time.sleep(2) 测试:子进程运行需要2-3秒 print('%s over'%self.name) if __name__ == '__main__': p=Myprocess('aaa') p.start() p.join(3) join参数中传入等待时间,单位是秒 print('start')
==》
aaa run
aaa over
start
等待是让父进程等待子进程,等待适当的时间让子进程完成运行
p.terminate() # 终止进程
print(p.name) # 进程的名称
print(p.is_alive()) #是否存活
p.terminate() # 与start一样 都是给操作系统发送指令 所以会有延迟
print(p.pid) 查看父进程编号
print(p.exitcode) # 获取退出码
阻塞,非阻塞
阻塞是指程序运行中遇到io操作 例如(本地io):input,sleep,print,read 等(网络io):recv,send,accept等会进入阻塞状态
非阻塞: 程序正常运行中 没有任何IO操作 就处于非阻塞状态
并行,并发
并行是指多个任务同时进行,必须有多核cpu才可以并行,也就是说并行依赖于cpu的多线程
并发可以说是伪并行,多个程序看起来是在同时运行但是实际上一个运算核心在多个任务之间快速切换来处理任务。
僵尸进程和孤儿进程
僵尸进程:值得是,子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程
僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程,linux 中有一个wai/waitpid 用于父进程回收子进程资源
孤儿进程:
指的是,父进程先结束 ,而子进程还在运行着,
孤儿进程无害,有 其存在的必要性,孤儿进程会被操作系统接管