首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python之multiprocessing,Process,进程池,进程通信

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(),

上边两个图的运行结果均如下:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180222A0ES2400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com