天天看點

36. Python 多程序

多程序概念:

程序是程式在計算機上的一次執行活動。當你運作一個程式,你就啟動了一個程序。顯然,程式是死的(靜态的),程序是活的(動态的)。程序可以分為系統程序和使用者程序。凡是用于完成作業系統的各種功能的程序就是系統程序,它們就是處于運作狀态下的作業系統本身;使用者程序就不必我多講了吧,所有由你啟動的程序都是使用者程序。程序是作業系統進行資源配置設定的機關。

它的思想簡單介紹如下:在作業系統的管理下,所有正在運作的程序輪流使用CPU,每個程序允許占用CPU的時間非常短(比如10毫秒),這樣使用者根本感覺不出來CPU是在輪流為多個程序服務,就好象所有的程序都在不間斷地運作一樣。但實際上在任何一個時間内有且僅有一個程序占有CPU。

#多程序允許我們充分的利用cpu

多程序和多線程的差別:

多程序使用的是CPU的多個核,适合運算密集型

充分利用多個CPU跑程序,系統執行率會更高

程序的範圍比線程的範圍大,程序是互相獨立的個體,一個程序挂了,不會影響其他程序的使用。

多線程使用的是CPU的一個核,适合IO密集型

線程是屬于程序下面的,線程之間存在共享資源,當一個線程挂了,會導緻相關的線程挂掉。

元件:

multiprocess子產品

支援建立子程序,通信,共享資料,執行不同形式的同步,提供Process(建立子程序)、Pipe(管道[預設為雙向,可以單向])、Lock(程序鎖[當一個程序讀檔案,會鎖定不讓其他程序讀,當這個程序讀完,會解開鎖,讓其他程序讀檔案])等元件。

多程序 multiprocess子產品方法:

<code>import</code> <code>multiprocessing</code>

<code>p </code><code>=</code> <code>multiprocessing.cpu_count()       </code><code>#統計cpu的個數</code>

<code>m </code><code>=</code> <code>multiprocessing.active_children() </code><code>#統計存在的子程序</code>

<code>print</code> <code>(p)</code>

<code>print</code> <code>(m)</code>

常用的程序方法:

is_alive()           判斷程序是否存活

run() 啟動程序

start() 啟動程序,會自動調用run方法,這個常用

join(timeout) 等待程序結束或者直到逾時

常用的屬性:

name 程序名字

pid 程序的pid

<code>import</code> <code>time</code>

<code>def</code> <code>worker_1(interval):</code>

<code>    </code><code>time.sleep(interval)</code>

<code>    </code><code>print</code> <code>(</code><code>"hello world"</code><code>)</code>

<code>    </code> 

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>

<code>    </code><code>c </code><code>=</code> <code>multiprocessing.Process(target</code><code>=</code><code>worker_1, args</code><code>=</code><code>(</code><code>5</code><code>,))</code>

<code>           </code><code>#target 代表目标函數名字,沒有括号</code>

<code>           </code><code>#args 代表worker_1所需要的參數,args所接收的參數類型是tuple,單元素要加逗号</code>

<code>    </code><code>c.start()                     </code><code>#啟動程序</code>

<code>    </code><code>print</code> <code>(c.is_alive())        </code><code>#确定程序是否存活</code>

<code>    </code><code>c.join(timeout</code><code>=</code><code>1</code><code>)          </code><code>#等待子程序執行完畢,或者逾時退出</code>

<code>    </code><code>print</code> <code>(</code><code>"end main"</code><code>)</code>

多程序執行個體:

<code>def</code> <code>worker(name, interval):</code>

<code>    </code><code>print</code> <code>(</code><code>"work {0} start"</code><code>.</code><code>format</code><code>(name))</code>

<code>    </code><code>print</code> <code>(</code><code>"work {0} end"</code><code>.</code><code>format</code><code>(name))</code>

<code>    </code><code>print</code> <code>(</code><code>"main start"</code><code>)</code>

<code>    </code><code>print</code> <code>(</code><code>"統計cpu有{0}核"</code><code>).</code><code>format</code><code>(multiprocessing.cpu_count())</code>

<code>    </code><code>p1 </code><code>=</code> <code>multiprocessing.Process(target</code><code>=</code><code>worker, args</code><code>=</code><code>(</code><code>"worker1"</code><code>, </code><code>2</code><code>))</code>

<code>    </code><code>p2 </code><code>=</code> <code>multiprocessing.Process(target</code><code>=</code><code>worker, args</code><code>=</code><code>(</code><code>"worker2"</code><code>, </code><code>3</code><code>))</code>

<code>    </code><code>p3 </code><code>=</code> <code>multiprocessing.Process(target</code><code>=</code><code>worker, args</code><code>=</code><code>(</code><code>"worker3"</code><code>, </code><code>4</code><code>))</code>

<code>    </code><code>p1.start()</code>

<code>    </code><code>p2.start()</code>

<code>    </code><code>p3.start()</code>

<code>    </code><code>for</code> <code>p </code><code>in</code> <code>multiprocessing.active_children():</code>

<code>        </code><code>print</code> <code>(</code><code>"pid名稱{0},pid号{1}"</code><code>.</code><code>format</code><code>(p.name, p.pid))</code>

<code>    </code><code>print</code><code>(</code><code>"main end"</code><code>)</code>

列印結果:

main start

統計cpu有4核

pid名稱Process-1,pid号6388

pid名稱Process-3,pid号3176

pid名稱Process-2,pid号1268

main end

work worker1 start

work worker3 start                  ## p1,p2,p3啟動以後都是獨立運作的,先後可以不是順序,有的啟動快,有的啟動慢

work worker2 start

work worker1 end

work worker2 end

work worker3 end                  ## 關閉程序必須按照啟動的順序P1,P2,P3的順序。

本文轉自 聽丶飛鳥說 51CTO部落格,原文連結:http://blog.51cto.com/286577399/2048829