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元无门槛券
私享最新 技术干货