python 多进程详细总结
多进程:是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
特征:
- 动态性:进程的实质是程序在多任务系统中的一次执行过程,进程是动态产生,动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度执行
- 结构特征:进程由程序、数据和进程控制块三部分组成。
- 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
python中多进程模块multiprocessing的基本使用:
创建并开启进程的两种方法:
#方法一 直接调用import time
import random
from multiprocessing import Process
def run(name):
print('%s runing' %name)
time.sleep(random.randrange(1,5))
print('%s running end' %name)
'''
创建三个进程
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,'anne',)
'''
p1=Process(target=run,args=('anne',))
p2=Process(target=run,args=('alice',))
p3=Process(target=run,args=('biantai',))
p4=Process(target=run,args=('haha',))
p1.start()
p2.start()
p3.start()
p4.start()
print('主进程')
#方法二 继承式调用
import time
import random
from multiprocessing import Process
class Run(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s runing' %self.name)
time.sleep(random.randrange(1,5))
print('%s runing end' %self.name)
p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
print('主进程')
注:上述代码的运行顺序是启动程序时主进程随之启动,接下来主进程负责创建3个子进程,3个子进程去分别执行自己的任务,此时主进程会继续往下走,但有的时候我们需要子进程任务结束之后才让主进程往下走,此时我就需要让主进程等待子进程完成任务后再往下走。此时就用到了join(), 例如:
import time
import random
from multiprocessing import Process
class Run(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s runing' %self.name)
time.sleep(random.randrange(1,5))
print('%s runing end' %self.name)
p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
p1.join() #等待p1进程停止
p2.join()
p3.join()
p4.join()
print('主线程')
#注意上面的代码是主进程等待子进程,等待的是主进程,所以等待的总时间是子进程中耗费时间最长的那个进程运行的时间
#上述启动进程与join进程可以简写为
# p_l=[p1,p2,p3,p4]
#
# for p in p_l:
# p.start()
#
# for p in p_l:
# p.join()
主进程等待子进程结束
进程之间不共享全局变量:
import os
from multiprocessing import Process
a = 100
def run():
print("子进程正在执行pid为{}".format(os.getpid()))
global a
a += 100
print("子进程执行结束a的值为{}".format(a))
if __name__ == '__main__':
p=Process(target=run)
p.start()
p.join()
print("父进程{}执行结束a的值为{}".format(os.getppid(),a))
'''
结果:
子进程正在执行pid为57822
子进程执行结束a的值为200
父进程16504执行结束a的值为100
'''