1. 程式人生 > >python程序和執行緒學習筆記

python程序和執行緒學習筆記

執行緒是最小的執行單元,而程序由至少一個執行緒組成。如何排程程序和執行緒,完全由作業系統決定,程式自己不能決定什麼時候執行,執行多長時間。

多程序和多執行緒的程式涉及到同步、資料共享的問題,編寫起來更復雜。

程序

  • 子程序呼叫getppid()可以拿到父程序的ID。

  • multiprocessing模組就是跨平臺版本的多程序模組。multiprocessing模組提供了一個Process類來代表一個程序物件。from multiprocessing import Process

  • 建立子程序時,只需要傳入一個執行函式和函式的引數,建立一個Process例項,用start()方法啟動,這樣建立程序比fork()還要簡單。

  • join()方法可以等待子程序結束後再繼續往下執行,通常用於程序間的同步。

  • 對Pool物件呼叫join()方法會等待所有子程序執行完畢,呼叫join()之前必須先呼叫close(),呼叫close()之後就不能繼續新增新的Process了。

  • Pool的預設大小:p = Pool(5)預設大小為5。

  • subprocess模組可以讓我們非常方便地啟動一個子程序,然後控制其輸入和輸出。

  • communicate()方法輸入。

  • Python的multiprocessing模組包裝了底層的機制,提供了Queue、Pipes等多種方式來交換資料。

  • 由於Windows沒有fork呼叫,因此,multiprocessing需要“模擬”出fork的效果,父程序所有Python物件都必須通過pickle序列化再傳到子程序去,所有,如果multiprocessing在Windows下呼叫失敗了,要先考慮是不是pickle失敗了。

  • 小結:
    在Unix/Linux下,可以使用fork()呼叫實現多程序。

    要實現跨平臺的多程序,可以使用multiprocessing模組。

    程序間通訊是通過Queue、Pipes等實現的。

執行緒

_thread和threading(常用),_thread是低階模組,threading是高階模組,對_thread進行了封裝。

  • Python的threading模組有個current_thread()函式,它永遠返回當前執行緒的例項。

  • 多執行緒和多程序最大的不同在於,多程序中,同一個變數,各自有一份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享。執行緒之間共享資料最大的危險在於多個執行緒同時改一個變數,把內容給改亂了。

  • Python直譯器由於設計時有GIL全域性鎖,導致了多執行緒無法利用多核。多執行緒的併發在Python中就是一個美麗的夢。