进程 multiprocessing详解

一 ,核心
就是像线程一样管理进程 ,类似于threading ,cup利用率较好,该模块用来跨平台的多进程模块,含有一个Process 类代表进程对象,start() 启动进程
Process语法结构如下:
Process([group [, target [, name [, args [, kwargs]]]]])
target:表示这个进程实例所调用对象;
args:表示调用对象的位置参数元组;
kwargs:表示调用对象的关键字参数字典;
name:为当前进程实例的别名;#
group:大多数情况下用不到;
Process类常用方法:
is_alive():判断进程实例是否还在执行;
join([timeout]):是否等待进程实例执行结束,或等待多少秒;
start():启动进程实例(创建子进程);
run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;
terminate():不管任务是否完成,立即终止;
Process类常用属性:
name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;
pid:当前进程实例的PID值;
三,进程的创建
1.直接通过Process 创建进程
2,通过继承Process,重写init,run方法
 
3,创建进程池------Pool
方法
apply_async(func[, args[, kwds]]) 使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程 args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
apply(func[, args[, kwds]]):使用阻塞方式调用func--等待是上一个任务执行
close():关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,立即终止;
join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;主进程创建或添加任务后 默认不会等待进程池中的任务执行完后才结束。而是当主进程的任务做完后,立马结束,如果这个地方没有join 会导致进程池中的任务不会执行
 
(向进程中添加任务
注意:如果添加的任务数量超过进程池中进程的数量,不会导致添加不进去,
添加到进程的任务,如果还没有执行的话,那么系好似他们会等带进程池中的一个进程完成任务后,会自动去用刚刚完成任务的进程我i完成新的任务
 
),
 
同步、异步、阻塞和非阻塞四种调用方式。
每次循环将空闲下来的子进程去调用目标===非堵塞方式
设置进程池最大子进程数
阻塞就是干不完不准回来,   
非阻塞就是你先干,我现看看有其他事没有,完了告诉我一声
同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者
老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。
 
四,进程间通信 队列Queue--是线程安全的
多个进程配合进程===数据交互----缓存区
方法
 
用于实现多个进程之间的数据传递
创建Queue对象时 没有指定则没有上限值
Queue.========先进先出
qsize() 返回当前队列中消息的数量
empty() 判断是否为空、
full 判断是否满l
get 获取队列中的一条消息,然后将其在队列中移除
 
Queue.get_nowait():相当Queue.get(False);
Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True堵塞
 
 
生产者消费者模型queue 作为管道 ====单向队列
进程池之间的进程通信==
 
 
posted @ 2017-12-05 09:19  予沫笙  阅读(1226)  评论(0编辑  收藏  举报