一、multiprocessing
multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务。
multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件
1、Process
需要使用关键字的方式来指定参数 args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号,kwargs传的是字典
创建子进程1
class MyProcess(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s is running'%self.name)
time.sleep(3)
print('%s is done'%self.name)
if __name__=='__main__':
p=MyProcess('lg')
p.start()
print('主')
创建子进程2
from multiprocessing import Process
import time
def take(name):
print('%name is running'%name)
time.sleep(3)
print('%name is done'%name)
if __name__=='__main__':
#在windows系统之上,开启子进程的操作一定要放到这下面
p=Process(target==take,arge=('lg',))
p.start()#向操作系统发送请求,操作系统会申请内存空间,然后把父进程的数据拷贝给子进程,作为子进程的初始状态
print('=====主')
p.start():启动进程,并调用该子进程中的p.run() p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.name:进程的名称
p.pid:进程的pid
进程直接的内存空间是隔离的而且是物理隔离
from multiprocessing import Process
import time
x=1000
def task():
time.sleep(1)
global x
x=0
print('aaa',x)
if __name__=='__main__':
print(x)
p=Process(target=task)
p.start()
time.sleep(3)
print(x)
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
x=1000
def task(n):
print('%s is runing'%n)
time.sleep(n)
if __name__=='__main__':
start_time=time.time()
p1=Process(traget=task,args=(1,),name='任务1')
p1.start()
print(p1.pid)
print(p1,name)
p1.terminate()
p1.join()
print(p1.is_alive())
print('=========主')
僵尸与孤儿进程
孤儿就是主进程干掉了,它产生的子进程没被干掉,系统就会定期回收,无害
僵尸进程就是子进程干掉了但还留着pid只能等主进程加收如果主进程还没有来得及回收就被干掉后init才会回收,如果主进程一直不死,这样会过多占用pid。
linux用
from multiprocessing import Process
import time,os
def task(n):
print('%s is running'%n)
time.sleep(n)
if __name__=='__main__':
p1=Process(tartget=task,args=(1,))
p2=Process(tartget=task,args=(2,))
p3=Process(tartget=task,args=(3,))
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print('====主====',os.getpid())
time.sleep(10000)