1. python中的多程序程式設計概念:由於python是跨平台的,自然也應該提供乙個跨平台的多程序支援。multiprocessing模組就是跨平台版本的多程序模組。multiprocessing模組提供了乙個process類來代表乙個程序物件。
2. python中的多執行緒程式設計具體做法:當我們引入該multiprocessing模組後,對需要進行呼叫的函式建立程序:b= process(target=函式名, args=(實參,)),因為process是乙個類,所以b就是乙個target函式的程序物件,我們也可以在裡面新增name屬性進行定義這個程序的名字,但python一般都是自動給這個程序乙個名字,b.start()通過呼叫start()函式進行啟動程序來執行函式,p.join()通過呼叫join()函式來說明當需要呼叫執行的函式呼叫完畢以後緊接著執行後面的語句**,這個函式的左右就好像乙個承接作用。
4. process之間肯定是需要通訊的,作業系統提供了很多機制來實現程序間的通訊。python的multiprocessing模組包裝了底層的機制,提供了queue、pipes等多種方式來交換資料,以queue為例,我們可以寫兩個函式,乙個是read函式,乙個是write函式,引入queue以後,我們b=queue()來建立乙個b佇列物件,然後在read函式中用a=b.get(true)來取出佇列b中的值,在write函式中通過b.put(value)將value寫入佇列b中,這樣以後,我們再建立倆個程序,然後start()呼叫執行,這倆個程序之間就可以用queue來進行通訊了。
5. 在unix/linux下,可以使用fork()呼叫實現多程序。要實現跨平台的多程序,可以使用multiprocessing模組。程序間通訊是通過queue、pipes等實現的。
6. python中的多執行緒程式設計:python的標準庫提供了兩個模組:_thread和threading,_thread是低階模組,threading是高階模組,對_thread進行了封裝。絕大多數情況下,我們只需要使用threading這個高階模組
7. python中的多程序程式設計做法:與多程序程式設計類似,b= threading.thread(target=函式名, name=執行緒別名),t.start()啟動執行緒執行函式,t.join()承接作用
8. 多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。(這裡的變數指的是模組中的全域性變數)
9. 多執行緒中的lock,b= threading.lock()來建立鎖物件b,對於與全域性變數有關的函式中定義鎖機制lock.acquire(),也就是多執行緒在執行這個函式時都要先得到這個鎖,然後才能進行下面的語句**,否則進入排隊佇列進行等待,執行完函式後lock.release()來進行釋放鎖,給等待佇列中的執行緒繼續執行,這樣就避免了執行緒在交替執行時全域性變數的不穩定性。
10. 多執行緒程式設計,模型複雜,容易發生衝突,必須用鎖加以隔離,同時,又要小心死鎖的發生。python直譯器由於設計時有gil全域性鎖,導致了多執行緒無法利用多核。多執行緒的併發在python中就是乙個美麗的夢。
11. 在多執行緒環境下,每個執行緒都有自己的資料。乙個執行緒使用自己的區域性變數比使用全域性變數好,因為區域性變數只有執行緒自己能看見,不會影響其他執行緒,而全域性變數的修改必須加鎖。前面我們已經直到用lock進行多執行緒中的全域性變數進行加鎖,但是,python有提供了另一種方法,可以對全域性變數不加鎖,單個執行緒裡的"全域性變數",就是執行緒裡的所有函式都可訪問,但其它執行緒無法訪問的變數...它叫做threadlocal。
12.threadloca的使用方法:我們通過b= threading.local()來建立b全域性變數,而b又是乙個threadlocal物件,在各個函式中可以定義b.a,b.c,b.e這些執行緒中的區域性變數,是b的屬性,就好像b是執行緒的全域性變數,後面的b.a,b.e是執行緒的全域性子變數,我們可以把他們全部看成是某個執行緒的全域性變數,這樣在多執行緒交替執行的時候,每個執行緒都能用自己的全域性變數,就避免了源程式中的全域性變數共享的問題。
13. 首先,要實現多工,通常我們會設計master-worker模式,master負責分配任務,worker負責執行任務,因此,多工環境下,通常是乙個master,多個worker。如果用多程序實現master-worker,主程序就是master,其他程序就是worker。如果用多執行緒實現master-worker,主線程就是master,其他執行緒就是worker。
14. 多程序優缺點:多程序模式最大的優點就是穩定性高,因為乙個子程序崩潰了,不會影響主程序和其他子程序。(當然主程序掛了所有程序就全掛了,但是master程序只負責分配任務,掛掉的概率低)
多程序模式的缺點是建立程序的代價大,在unix/linux系統下,用fork呼叫還行,在windows下建立程序開銷巨大。另外,作業系統能同時執行的程序數也是有限的,在記憶體和cpu的限制下,如果有幾千個程序同時執行,作業系統連排程都會成問題
16. 無論是多程序還是多執行緒,只要數量一多,效率肯定上不去,為什麼呢?因為多執行緒多程序是交替執行的,所以會有切換過程,這個切換過程雖然很快,但是也需要耗費時間。如果有幾千個任務同時進行,作業系統可能就主要忙著切換任務,根本沒有多少時間去執行任務了,這種情況最常見的就是硬碟狂響,點視窗無反應,系統處於假死狀態。所以,多工一旦多到乙個限度,就會消耗掉系統所有的資源,結果效率急劇下降,所有任務都做不好。
18. io密集型任務:涉及到網路、磁碟io的任務都是io密集型任務,這類任務的特點是cpu消耗很少,任務的大部分時間都在等待io操作完成(因為io的速度遠遠低於cpu和記憶體的速度)。對於io密集型任務,任務越多,cpu效率越高,但也有乙個限度。常見的大部分任務都是io密集型任務,比如web應用。io密集型任務執行期間,99%的時間都花在io上,花在cpu上的時間很少,因此,用執行速度極快的c語言替換用python這樣執行速度極低的指令碼語言,完全無法提公升執行效率。對於io密集型任務,最合適的語言就是開發效率最高(**量最少)的語言,指令碼語言是首選,c語言最差
19. if __name__ == '__main__':的作用是:判斷該模組是否是直接執行還是在被呼叫到另外乙個模組中進行執行,
如果我們是直接執行某個.py檔案的時候,該檔案中那麼」__name__ == '__main__'「是true,但是我們如果從另外乙個.py檔案通過import匯入該檔案的時候,這時__name__的值就是我們這個py檔案的名字而不是__main__。這個功能還有乙個用處:除錯**的時候,在」if __name__ == '__main__'「中加入一些我們的除錯**,我們可以讓外部模組
呼叫的時候不執行我們的除錯**,但是如果我們想排查問題的時候,直接執行該模組檔案,除錯**能夠正常執行!
python菜鳥日記5
1.在python中我們可以匯入模組,來呼叫模組裡面的函式,在乙個模組中,我們可以定義很多的函式和變數,但有些函式我們並不希望被別人使用,只希望在模組內部使用,那麼,我們可以通過 下劃線 字首來實現,比如 abc,qiuhe,但是python並沒有強制限制訪問函式或變數,只是一種程式設計的習慣而已 ...
python菜鳥日記6
在函式呼叫的過程中,假設函式裡面有迴圈巢狀的函式,那麼在裡面的函式遇到異常的時候,就終止函式,後面的語句將不會執行,而try後面的語句也將會中止執行,轉而except。異常其實也是乙個類,是乙個物件 此外,如果沒有錯誤發生,可以在except語句塊後面加乙個else,當有錯誤發生時,會自動執行els...
python菜鳥日記9
1.collections模組中有乙個namedtuple函式,它用來建立乙個自定義的tuple物件,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素,這樣一來,我們用namedtuple可以很方便地定義一種資料型別,它具備tuple的不變性,又可以根據屬性來引用,使...