強大的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