from multiprocessing import Pool
import time, os, random
#首先创建子进程函数
def run(name):
print('子进程%s启动,进程号:%s' % (name, os.getpid()))
#为了验证进程执行数量可以采取随机停止时间
#记录开始时间
start = time.time()
time.sleep(random.choice(range(1,4))) #随机停止1-3秒
#结束时间
end = time.time()
#子进程结束标志
print('子进程%s结束,子进程号:%s, 停留时间:%d' %(name, os.getpid(), end - start))
if __name__ == "__main__":
#主进程开始
print('主进程启动')
#创建一个进程池,并设置最大同时执行数量
p = Pool(3)
#开始创建子进程并启动
for i in range(10):
p.apply_async(run, args=(i,))
p.close() #关闭进程池
p.join() #合并父子进程让父进程在子进程运行完后结束
#主进程结束标志
print('父进程结束')
#多进程的创建可以采用multiprocessing模块中的Pool类来进行
#创建方式:
p = Pool(可选参数) #该参数决定能够同时执行的子进程数,不填写则默认为电脑cpu的核心数量
#这样只是创建了一个进程池对象,并没有创建真正的子进程,可以用用for循环来创建需要创建的进程
for i in range(10):
p.apply_async(run[子进程执行的函数名], args=(i,)[需要用到的参数])
#这样就可以创建10个子进程,在子进程的执行过程中最多一次执行Pool(可选参数),可选参数个子进程。当某一个子进程执行完成之后,立刻剩下的子进程数,但是同时不超过可选参数个。
#进程池和单个子进程创建的区别:
1.单个子进程的启动需要手动,进程池的不需要
2.进程池可以选择同时执行的最大数量
3.在p.join()前加p.close()关闭进程池。关闭之后不能再添加子进程。写在p.join()后无效