首页
学习
活动
专区
工具
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元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券