1. 程式人生 > >理解一下Python中的多執行緒,多程序,多協程

理解一下Python中的多執行緒,多程序,多協程

  • 程序
    一個執行的程式(程式碼)就是一個程序,沒有執行的程式碼叫程式,程序是系統資源分配的最小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共享,開銷大。

  • 執行緒,
    排程執行的最小單位,也叫執行路徑,不能獨立存在,依賴程序存在一個程序至少有一個執行緒,叫主執行緒,而多個執行緒共享記憶體(資料共享,共享全域性變數),從而極大地提高了程式的執行效率。

  • 協程
    是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程擁有自己的暫存器上下文和棧。 協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧,直接操作棧則基本沒有核心切換的開銷,可以不加鎖的訪問全域性變數,所以上下文的切換非常快

執行緒是非獨立的,同一個程序裡執行緒是資料共享的,當各個執行緒訪問資料資源時會出現競爭狀態即:資料幾乎同步會被多個執行緒佔用,造成資料混亂 ,即所謂的執行緒不安全
那麼怎麼解決多執行緒競爭問題?-- 鎖。

  • 鎖的好處

確保了某段關鍵程式碼(共享資料資源)只能由一個執行緒從頭到尾完整地執行能解決多執行緒資源競爭下的原子操作問題

  • 鎖的壞處

阻止了多執行緒併發執行,包含鎖的某段程式碼實際上只能以單執行緒模式執行,效率就大大地下降了鎖的致命問題:死鎖

  • 什麼是死鎖呢?

若干子執行緒在系統資源競爭時,都在等待對方對某部分資源解除佔用狀態,結果是誰也不願先解鎖,
互相干等著,程式無法執行下去,這就是死鎖。

  • GIL 鎖 全域性直譯器鎖

(只在 cpython 裡才有)
作用:限制多執行緒同時執行,保證同一時間只有一個執行緒執行,所以 cpython 裡的多執行緒其實是偽多線
所以 Python 裡常常使用協程技術來代替多執行緒,協程是一種更輕量級的執行緒,
程序和執行緒的切換時由系統決定,而協程由我們程式設計師自己決定,而模組 gevent 下切換是遇到了耗時操作才會切換。

  • 三者的關係:程序裡有執行緒,執行緒裡有協程。