multiprocessing
由于Python是跨平台的,?然也应该提供?个跨平台的多进程?持。 multiprocessing模块就是跨平台版本的多进程模块。
创建?进程时,只需要传??个执?函数和函数的参数,创建?个 Process实例,?start()?法启动,这样创建进程?fork()还要简单。
join()?法可以等待?进程结束后再继续往下运?,通常?于进程间的同 步
Process语法结构如下:
Process([group [, target [, name [, args [, kwargs]]]]])
target:表示这个进程实例所调?对象;
args:表示调?对象的位置参数元组;
kwargs:表示调?对象的关键字参数字典;
name:为当前进程实例的别名;
group:?多数情况下?不到;
Process类常??法:
is_alive():判断进程实例是否还在执?;
join([timeout]):是否等待进程实例执?结束,或等待多少秒;
start():启动进程实例(创建?进程);
run():如果没有给定target参数,对这个对象调?start()?法时,就将执 ?对象中的run()?法;
terminate():不管任务是否完成,?即终?;
类常?属性:
name:当前进程实例别名,默认为Process-N,N为从1开始递增的整 数;
pid:当前进程实例的PID值;
进程创建 Process
创建新的进程还能够使?类的?式,可以?定义?个类,继承Process类,每 次实例化这个类的时候,就等同于实例化?个进程对象
导入Process
继承Process
重写run方法
*在init方法需要调用Process.__init__(self)
p1=Process_class(1)
p1.start()
p1.jion()
进程池pool
当需要创建的?进程数量不多时,可以直接利?multiprocessing中的Process 动态成?多个进程,但如果是上百甚?上千个?标,?动的去创建进程的? 作量巨?,此时就可以?到multiprocessing模块提供的Pool?法。 初始化Pool时,可以指定?个最?进程数,当有新的请求提交到Pool中时, 如果池还没有满,那么就会创建?个新的进程?来执?该请求;但如果池中 的进程数已经达到指定的最?值,那么该请求就会等待,直到池中有进程结 束,才会创建新的进程来执行
multiprocessing.Pool常?函数解析:
apply_async(func[, args[, kwds]]) :使??阻塞?式调?func(并?执 ?,堵塞?式必须等待上?个进程退出才能执?下?个进程),args为 传递给func的参数列表,kwds为传递给func的关键字参数列表;
apply(func[, args[, kwds]]):使?阻塞?式调?func
close():关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,?即终?;
join():主进程阻塞,等待?进程的退出, 必须在close或terminate之后 使?;
Queue 进程间通信
Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。
可以使?multiprocessing模块的Queue实现多进程之间的数据传递,Queue 本身是?个消息列队程序,
使用multiprocessing里边Queue模块创建一个消息队列
q=Queue(num) num 为创建的消息的个数,若括号中没有指定最?可接收 的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到 内存的尽头);
Queue.qsize():返回当前队列包含的消息数量;
Queue.empty():如果队列为空,返回True,反之False ;
Queue.full():如果队列满了,返回True,反之False;
Queue.get([block[, timeout]]):获取队列中的?条消息,然后将其从列队 中移除,block默认值为True;
1)如果block使?默认值,且没有设置timeout(单位秒),消息列队如果已 经没有空间可写?,此时程序将被阻塞(停在写?状态),直到从消息列队 腾出空间为?,如果设置了timeout,则会等待timeout秒,若还没空间,则抛 出"Queue.Full"异常;
2)如果block值为False,消息列队如果没有空间可写?,则会?刻抛 出"Queue.Full"异常;
Queue.get_nowait():相当Queue.get(False);
Queue.put(item,[block[, timeout]]):将item消息写?队列,block默认值 为True;
. 进程池中的Queue
如果要使?Pool创建进程,就需要使?multiprocessing.Manager()中的 Queue(),?不是multiprocessing.Queue(),
上边两个图的运行结果均如下:
领取专属 10元无门槛券
私享最新 技术干货