强大的Manager模块
上一节实现的数据共享的方式只有两种结构Value和Array。
Python中提供了强大的Manager模块,专门用来做数据共享。
他支持的类型非常多,包括:Value、Araay、list、dict、Queue、Lock等。
以下例子:
<code>import</code> <code>multiprocessing</code>
<code>def</code> <code>worker(d,l):</code>
<code> </code><code>l </code><code>+</code><code>=</code> <code>range</code><code>(</code><code>11</code><code>, </code><code>16</code><code>)</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>xrange</code><code>(</code><code>1</code><code>, </code><code>6</code><code>):</code>
<code> </code><code>key </code><code>=</code> <code>"key{0}"</code><code>.</code><code>format</code><code>(i)</code>
<code> </code><code>val </code><code>=</code> <code>"val{0}"</code><code>.</code><code>format</code><code>(i)</code>
<code> </code><code>d[key] </code><code>=</code> <code>val</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>
<code> </code><code>manager </code><code>=</code> <code>multiprocessing.Manager()</code>
<code> </code><code>d </code><code>=</code> <code>manager.</code><code>dict</code><code>()</code>
<code> </code><code>l </code><code>=</code> <code>manager.</code><code>list</code><code>()</code>
<code> </code><code>p </code><code>=</code> <code>multiprocessing.Process(target</code><code>=</code><code>worker, args</code><code>=</code><code>(d, l))</code>
<code> </code><code>p.start()</code>
<code> </code><code>p.join()</code>
<code> </code><code>print</code><code>(d)</code>
<code> </code><code>print</code><code>(l)</code>
打印结果:
<code>{</code><code>'key3'</code><code>: </code><code>'val3'</code><code>, </code><code>'key2'</code><code>: </code><code>'val2'</code><code>, </code><code>'key1'</code><code>: </code><code>'val1'</code><code>, </code><code>'key5'</code><code>: </code><code>'val5'</code><code>, </code><code>'key4'</code><code>: </code><code>'val4'</code><code>}</code>
<code>[11, 12, 13, 14, 15]</code>
进程池:
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,
如果池还没有满,那么就会创建一个新的进程用来执行该请求;
但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程。
阻塞和非阻塞的区别:
Pool.apply_async 非阻塞,定义的进程池进程最大数可以同时执行。
Pool.apply 一个进程结束,释放回进程池,下一个进程才可以开始
举例:
非阻塞:
<code>import</code> <code>time</code>
<code>def</code> <code>worker(msg):</code>
<code> </code><code>print</code> <code>(</code><code>"#######start {0}########"</code><code>.</code><code>format</code><code>(msg))</code>
<code> </code><code>time.sleep(</code><code>1</code><code>)</code>
<code> </code><code>print</code> <code>(</code><code>"#######end {0}########"</code><code>.</code><code>format</code><code>(msg))</code>
<code> </code><code>pool </code><code>=</code> <code>multiprocessing.Pool(processes</code><code>=</code><code>3</code><code>)</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>xrange</code><code>(</code><code>1</code><code>, </code><code>10</code><code>):</code>
<code> </code><code>msg </code><code>=</code> <code>"hello{0}"</code><code>.</code><code>format</code><code>(i)</code>
<code> </code><code>pool.apply_async(func</code><code>=</code><code>worker, args</code><code>=</code><code>(msg,))</code>
<code> </code><code>pool.close()</code>
<code> </code><code>pool.join() </code><code>#调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束</code>
<code> </code><code>print</code> <code>(</code><code>"main end"</code><code>)</code>
<code>#######start hello1########</code>
<code>#######start hello2########</code>
<code>#######start hello3########</code>
<code>#######end hello1########</code>
<code>#######start hello4########</code>
<code>#######end hello2########</code>
<code>#######start hello5########</code>
<code>#######end hello3########</code>
<code>#######start hello6########</code>
<code>#######end hello4########</code>
<code>#######start hello7########</code>
<code>#######end hello5########</code>
<code>#######start hello8########</code>
<code>#######end hello6########</code>
<code>#######start hello9########</code>
<code>#######end hello7########</code>
<code>#######end hello8########</code>
<code>#######end hello9########</code>
<code>main end</code>
阻塞:
<code> </code>
<code> </code><code>pool.</code><code>apply</code><code>(func</code><code>=</code><code>worker, args</code><code>=</code><code>(msg,))</code>
对比一下两种类型的输出状态即可明白。
本文转自 听丶飞鸟说 51CTO博客,原文链接:http://blog.51cto.com/286577399/2049893