1. 程式人生 > >python 進程 線程 協程

python 進程 線程 協程

gre mar 間隔 系統 event 多核 操作 margin 解決

  並發與並行:並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔內發生。在單核CPU下的多線程其實都只是並發,不是並行。

  進程是系統資源分配的最小單位,進程的出現是為了更好的利用CPU資源使到並發成為可能。進程由操作系統調度。

  線程的出現是為了降低上下文切換的消耗,提高系統的並發性,並突破一個進程只能幹一樣事的缺陷,使到進程內並發成為可能。線程共享進程的大部分資源,並參與CPU的調度, 當然線程自己也是擁有自己的資源的,例如,棧,寄存器等等。線程由操作系統調度。

  協程通過在線程中實現調度,避免了陷入內核級別的上下文切換造成的性能損失,進而突破了線程在IO上的性能瓶頸。協程由代碼調度。

  多個線程相對獨立,有自己的上下文,切換受系統控制;而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。

  線程,在計算機裏面通常的分類是內核級線程和用戶級線程。內核級線程的調度是由系統完成的,而用戶級線程的調度是由用戶來控制的。那麽Python標準庫提供的線程是那一類呢?如果我們了解或者使用過gevent和eventlet,進行下對比,我們就很容易回答出來了。Python提供的線程是內核級的,而gevent和eventlet提供的則是用戶級的線程。這類用戶級的線程,我們叫它協程,也可以叫green thread。

  GIL鎖是對於解釋器的,它保證一個進程同一時刻只存在一個解釋器實例,並不是說Python 不能利用多核,而是不能“有效”利用多核。一個進程的多個線程運行在多核上的時候,解釋器仍有可能被某一線程阻塞導致其它線程的代碼無法執行。移除GIL鎖是沒有必要的,會給多線程編程造成巨大的心智負擔。要想充分利用多核,可以使用多進程+協程的方式,多進程下不存在GIL鎖的問題,而協程的系統開銷遠比線程小所以理論上來說性能更優,協程可以輕松的達到十萬甚至百萬並發的級別,而子線程到達這個量級的時候調度開銷會比較大。從Python3加入的新特性asyncio可以知道,python官方也認為與其解決GIL鎖對多線程編程造成的困擾,不如轉而鼓勵使用語言級別的協程。雖然具體實現上有差別,然而Golang,Javascript也是采用類似的方式解決異步的問題的。

  uwsgi可以配置參數啟動多個進程,還可以配置一個進程有多個線程。eventlet則是開啟多個協程。   進程間通信的方法有:消息隊列(redis、mongoDB等)、管道、共享內存、信號

python 進程 線程 協程