多程序概念:
程序是程式在計算機上的一次執行活動。當你運作一個程式,你就啟動了一個程序。顯然,程式是死的(靜态的),程序是活的(動态的)。程序可以分為系統程序和使用者程序。凡是用于完成作業系統的各種功能的程序就是系統程序,它們就是處于運作狀态下的作業系統本身;使用者程序就不必我多講了吧,所有由你啟動的程序都是使用者程序。程序是作業系統進行資源配置設定的機關。
它的思想簡單介紹如下:在作業系統的管理下,所有正在運作的程序輪流使用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