进程创建
Process
from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print('启动子进程{}{}'.format(name, os.getpid())) if __name__ == '__main__': print('父进程{}'.format(os.getpid())) p = Process(target=run_proc, args=('test',)) print('子进程将要启动') p.start() p.join() print('子进程结束')
multiprocessing
模块就是跨平台版本的多进程模块,提供了一个Process
类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情
当需要创建的子进程数量不多时,可以直接利用multiprocessing
中的Process
动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing
模块提供的Pool
方法。
Pool(进程池)
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值
,那么该请求就会等待
,直到池中有进程结束,才会用之前的进程来执行新的任务
""" 如果要启动大量的子进程,可以用进程池的方式批量创建子进程: """ from multiprocessing import Pool import os, time, random def long_time_task(name): print('运行任务 %s (%s)...' % (name, os.getpid())) start = time.time() time.sleep(random.random() * 3) end = time.time() print('任务 %s 运行 %0.2f 秒' % (name, (end - start))) if __name__ == '__main__': print('父进程 %s.' % os.getpid()) p = Pool(4) # 创建进程池中最多存4个子进程 for i in range(5): # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,)) # 每次循环将会用空闲出来的子进程去调用目标 p.apply_async(long_time_task, args=(i,)) print('等待所有子进程完成...') p.close() # 关闭进程池,关闭后po不再接收新的请求 p.join() # 等待po中所有子进程执行完成,必须放在close语句之后 print('所有子进程完成.')
# 运行结果 >>> 等待所有子进程完成... >>> 运行任务 0 (3722)... >>> 运行任务 1 (3723)... >>> 运行任务 2 (3724)... >>> 运行任务 3 (3725)... >>> 任务 3 运行 0.67 秒 >>> 运行任务 4 (3725)... >>> 任务 2 运行 1.29 秒 >>> 任务 0 运行 2.00 秒 >>> 任务 1 运行 2.77 秒 >>> 任务 4 运行 2.31 秒 >>> 所有子进程完成.
multiprocessing.Pool常用函数解析:
- apply_async(func[, args[, kwds]]) :使用
非阻塞方式
调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表; - close():关闭Pool,使其不再接受新的任务;
- terminate():不管任务是否完成,立即终止;
- join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;
对Pool
对象调用join()
方法会等待所有子进程执行完毕,调用join()
之前必须先调用close()
,调用close()
之后就不能继续添加新的Process
了
标签:__,...,print,time,进程,Pool From: https://www.cnblogs.com/yogayao/p/17846637.html