線程:threading提供線程相關的操做。線程是應用程序工做的作小單位,它包含在進程中,是進程中的實際運行單位。一條線程指的是進程中一個單一順序的控制流,一個進程中能夠併發多個線程,每一個線程並執行不一樣的任務。程序員
threading模塊創建在-thread之上,thread以低級的最原始的方式來處理控制線程,而threading模塊經過對-thread二次封裝,提供了更方便的api來處理線程。api
線程鎖:咱們使用線程對數據進行操做的時候,若是多個線程同時修改某個數據的時候,可能會出現多個不一樣的預料結果,爲了保證數據的準確性,引入了鎖的概念。多線程
threading.Rlock與threading.Lock的區別:併發
Rlock容許在同一線程中被屢次acquire。而Lock卻不容許這樣,若是使用Rlock,那麼acquire和release必須成對出現,即調用了n次acquire必須調用n次release才能釋放所佔用的鎖。函數
threading.Eventui
Event是線程間通信最直接的機制之一。一個線程發送一個Event信號,則其餘線程等待這個信號。用於主線程控制其它線程的執行。Event管理一個flag,這個flag能夠使用set()設置成ture()或者使用clear()重置爲false。線程
wait()這用於阻塞,在flag爲ture以前,flag默認爲false設計
threading.Condition協程
Python提供的condition對象提供了對複雜線程同步問題的支持。condition被稱爲條件變量,除了提供與lock相似acquire和release方法外,還提供了wait和notify方法。線程首先acquire一個條件變量,而後判斷一些條件。對象
若是條件不知足則wait,若是條件知足進行一些處理改變條件後,經過notify方法通知其它線程,其它處於wait狀態的線程接到通知後會從新判斷條件,不斷的重複這一過程,從而解決複雜的同步問題。
在典型的設計風格里,利用condition變量鎖去訪問一些共享狀態,線程在獲取到它想獲得的狀態前,會反覆調用wait()。修改狀態的線程在他們狀態改變時調用notify()活notify-all(),用這種方式,線程會盡量的獲
取到想要的一個等待者的狀態。
數據共享:不一樣進程之間是不能數據共享的,想要共享用如下方法
當建立進程時,共享數據會被拿到子進程去,當進程中執行完畢後,再賦值給原值。
進程池
協程:協程又叫微線程,從技術的角度來說,「協程就是你能夠暫停執行的函數」,能夠把它理解成像生成器同樣。線程和進程的操做是由程序觸發系統接口,最後的執行者是系統,協程的操做則是程序員。
協程存在的意義:對於多線程應用,CPU經過切片的方式來切換線程間的執行,線程切換須要耗時(保存狀態,下次繼續)。協程只須要一個線程,在一個線程中規定某個代碼塊執行順序。
協程的適應場景:當程序中存在大量不須要的CPU操做時,適應於協程。