1. 程式人生 > 其它 >執行緒、程序和協程

執行緒、程序和協程

程序


程序是作業系統進行資源分配和排程的一個獨立單位,是應用程式的載體。程序一般有程式,資料集合和程序控制塊三部分組成。每一個程序都有自己的獨立記憶體空間,不同程序通過程序間通訊。由於程序比較重量,佔據獨立的記憶體,所以上下文程序間切換開銷比較大,但相對比較安全。

程序具有的特徵

  1. 動態性:程序是程式的一次執行過程,是臨時的,有生命週期的,是動態產生,動態消亡的。
  2. 併發性:任何程序都可以同其他程序一起併發執行
  3. 獨立性:程序是系統進行資源分配和排程的一個獨立單位
  4. 結構性:程式,資料集合和程序控制塊三部分組成

程序的生命週期:
程序在執行過程中有三種狀態:就緒、執行、阻塞。建立和退出狀態是程序的建立過程和推出過程
建立:程序正在建立,還不能執行。作業系統在建立程序時要進行的工作包括分配和建立程序,控制塊表象,建立資源表格並分配資源、載入程式並建立地址空間
就緒:時間片已用完,此執行緒被強制暫停,等待下一個屬於它的時間片到來
執行:此執行緒正在執行,正在佔用時間片
阻塞:等待狀態,等待某一個事件(如IO或另一個執行緒)執行完
退出:程序已結束,釋放作業系統分配的資源

執行緒


執行緒是能擁有資源和獨立執行的最小單位,也是程式執行的最小單位,是處理器排程的基本單元。執行緒一般有執行緒ID,當前指令指標,暫存器和堆疊組成。一個程序至少擁有一個執行緒,同一個程序中的多個執行緒共享該進行的資源。

執行緒的生命週期:
建立:一個新的執行緒被建立,等待該執行緒被呼叫執行
就緒:時間片已經用完,此執行緒被強制暫停,等待下一個屬於它的時間片到來
執行:此執行緒正在執行,正在佔用時間片
阻塞:等待狀態,等待某一個事件(如IO或另一個執行緒)執行完
退出:一個執行緒完成任務或者其他終止條件發生,該執行緒終止進入退出狀態,退出狀態釋放該執行緒所分配的資源。

協程

協程是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程擁有自己的暫存器上下文和棧。

程序和執行緒、協程在python中的使用

  1. 多程序一般使用multiprocessing庫,來利用多核CPU,主要是用於CPU密集型的程式
  2. 多執行緒一般使用threading庫,主要使用者一些IO密集型併發操作
  3. 協程一般使用gevent庫,主要用於非阻塞一步併發的程式

GIL鎖


GIL是CPython直譯器的概念,叫全域性直譯器鎖。

產生的原因:建立Python是隻考慮到單核CPU,解決多執行緒之間資料完整性和狀態同步的最簡單的方法就是加鎖,於是有了GIL,因為CPython解析只允許擁有GIL全域性解析器才能執行程式,這樣保證了同一時刻只允許一個執行緒使用CPU

解決辦法:

  1. 更換Cpython為Ipython
  2. 使用多程序完成多執行緒任務
  3. 在使用多執行緒的情況可以使用C語言完成