三十六、进程2(重点):进程池Pool、进程间通信(队列、栈)、多进程拷贝文件(综合运用)
一、进程池Pool
1、apply_async (func , args , kwds) 非阻塞方式
apply(func,args,) 阻塞方式
使用非阻塞方式调用函数(并行执行,进程间同步执行)
堵塞方式必须等待上一个进程退出才能执行下一个进程(相当于单进程执行)
args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
2、close():关闭Pool,使其不再接受新的任务
3、terminate():不管任务是否完成,立即终止
4、join():主进程阻塞,等待子进程的退出,必须在close或terminate之后使用
二、案例:创建3个进程池
1、pool=Pool() — ()内没有进程数,默认进程池大小等于CPU核心数(本机核心数为4),产生结果会4个进程一起执行(4个一组)
2、pool=Pool(3) — 进程池有3个进程一起执行
3、非阻塞不会阻止主进程,但阻塞方式会阻止主进程执行,必须等待子进程执行完毕才行
4、进程池里的进程数不是越大越好,需要根据操作系统来定的,需要合理分配。
三、进程间通信
1、队列:先进先出,后进后出
2、栈:先进后出,后进先出
3、队列的相关操作:
① 导入Queue from multiprocessing import Queue
② 创建队列: q=Queue() — 括号内不写,可放任何数量
q=Queue(3) — 创建队列,指定的是3,说明这个队列里面最多只能放3个
③ q.qsize() — 查看队列内容个数
④ q.put(" haha") — 往队列里放入内容
⑤ q.get() — 取出元素,遵循先进先出,后进后出原则
⑥ q.empty() —判断队列是否为空,True表示为空
⑦ q.full() — 判断队列是否为满,为False表示不满
⑧ q.get_nowait() — 取数据,有数据的话,就可以取出数据,没有取出数据时,直接抛出异常(非阻塞形式的)
⑨ q.put_nowait( [ ] /数字/字符串/列表 ) — 可存储任何数据类型,超过存放个数时,抛出异常
⑩上述两个抛出异常,可以用try方法,捕获异常
四、进程池中的Queue,需要导包Manager,pool(不导Queue了)
q=Manager() . Queue() — 创建队列
pool=Pool() — ()内没有进程数,默认进程池大小等于CPU核心数(本机核心数为4),产生结果会4个进程一起执行(4个一组)
5、实例:
五、多进程拷贝文件(综合运用)