執行緒、程序和協程
程序
程序是作業系統進行資源分配和排程的一個獨立單位,是應用程式的載體。程序一般有程式,資料集合和程序控制塊三部分組成。每一個程序都有自己的獨立記憶體空間,不同程序通過程序間通訊。由於程序比較重量,佔據獨立的記憶體,所以上下文程序間切換開銷比較大,但相對比較安全。
程序具有的特徵
- 動態性:程序是程式的一次執行過程,是臨時的,有生命週期的,是動態產生,動態消亡的。
- 併發性:任何程序都可以同其他程序一起併發執行
- 獨立性:程序是系統進行資源分配和排程的一個獨立單位
- 結構性:程式,資料集合和程序控制塊三部分組成
程序的生命週期:
程序在執行過程中有三種狀態:就緒、執行、阻塞。建立和退出狀態是程序的建立過程和推出過程
建立:程序正在建立,還不能執行。作業系統在建立程序時要進行的工作包括分配和建立程序,控制塊表象,建立資源表格並分配資源、載入程式並建立地址空間
就緒:時間片已用完,此執行緒被強制暫停,等待下一個屬於它的時間片到來
執行:此執行緒正在執行,正在佔用時間片
阻塞:等待狀態,等待某一個事件(如IO或另一個執行緒)執行完
退出:程序已結束,釋放作業系統分配的資源
執行緒
執行緒是能擁有資源和獨立執行的最小單位,也是程式執行的最小單位,是處理器排程的基本單元。執行緒一般有執行緒ID,當前指令指標,暫存器和堆疊組成。一個程序至少擁有一個執行緒,同一個程序中的多個執行緒共享該進行的資源。
執行緒的生命週期:
建立:一個新的執行緒被建立,等待該執行緒被呼叫執行
就緒:時間片已經用完,此執行緒被強制暫停,等待下一個屬於它的時間片到來
執行:此執行緒正在執行,正在佔用時間片
阻塞:等待狀態,等待某一個事件(如IO或另一個執行緒)執行完
退出:一個執行緒完成任務或者其他終止條件發生,該執行緒終止進入退出狀態,退出狀態釋放該執行緒所分配的資源。
協程
協程是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程擁有自己的暫存器上下文和棧。
程序和執行緒、協程在python中的使用
- 多程序一般使用multiprocessing庫,來利用多核CPU,主要是用於CPU密集型的程式
- 多執行緒一般使用threading庫,主要使用者一些IO密集型併發操作
- 協程一般使用gevent庫,主要用於非阻塞一步併發的程式
GIL鎖
GIL是CPython直譯器的概念,叫全域性直譯器鎖。
產生的原因:建立Python是隻考慮到單核CPU,解決多執行緒之間資料完整性和狀態同步的最簡單的方法就是加鎖,於是有了GIL,因為CPython解析只允許擁有GIL全域性解析器才能執行程式,這樣保證了同一時刻只允許一個執行緒使用CPU
解決辦法:
- 更換Cpython為Ipython
- 使用多程序完成多執行緒任務
- 在使用多執行緒的情況可以使用C語言完成