說起進程,就不得不說下程序。程序是指令和數據的有序集合,其本身沒有任何運行的含義,是一個靜態的概念。
而進程則是執行程序的一次執行過程,它是一個動態的概念。是系統資源分配的單位
通常在一個進程中可以包含若干個線程,當然一個進程中至少有一個線程,不然沒有存在的意義。線程是CPU調度和執行的的單位。
注意:很多多線程是模擬出來的,真正的多線程是指有多個cpu,即多核,如服務器。如果是模擬出來的多線程,即在一個cpu的情況下,在同一個時間點,cpu只能執行一個代碼,因為切換的很快,所以就有同時執行的錯局。
能大幅度提高程序的運行效率,優化用戶體驗,大大地縮短了程序的運行時間
注意:多線程只能進行並發操作,而不能利用多cpu(存在GIL全局解釋器鎖),利用的也是cpu與io可以並行運行的原理
全局解釋器鎖(英語:Global Interpreter Lock,縮寫GIL)
是計算機程序設計語言解釋器用於同步線程的一種機制,它使得任何時刻僅有一個線程在執行。
即便在多核心處理器上,使用GIL的解釋器也只允許同一時間執行一個線程。
這也是導致python執行速度慢的一個原因
表示了同一時刻只有一個線程在執行
GIL的作用:主要是為了解決多線程之間數據完整性和狀態同步問題
雖然不能利用多核cpu的優勢,但是還是可以實現cpu與io並行的操作,也可以大幅提升速度
主要用到threading的Thread類
實際上本質就是,定義一個中間的緩沖區作為生產者與消費者交互的通道,比如餐廳這一場景,以櫃台為中間件,生產者生產好後,就調用中間件中push的方法,消費者消費完後就調用中間件的pop方法,再加一定的數量限制即可
即由中間件容器創造資源的增刪改的操作
消費者就只負責消費商品,進行刪的獲取操作
生產者就負責生產商品,負責增加的操作
系統啟動一個新線程的成本是比較高的,因為它涉及與操作系統的交互。在這種情形下,使用線程池可以很好地提升性能,尤其是當程序中需要創建大量生存期很短暫的線程時,更應該考慮使用線程池,以此來避免過大的線程的創建與銷毀的開銷
線程池在系統啟動時即創建大量空閒的線程,程序只要將一個函數提交給線程池,線程池就會啟動一個空閒的線程來執行它。當該函數執行結束後,該線程並不會死亡,而是再次返回到線程池中變成空閒狀態,等待執行下一個函數
線程的生命周期
線程池使用的是concurrent.futures 下的ThreadPoolExecutor類
submit方法將傳入的方法交給線程池,後面直接跟參數值或者關鍵字傳值,返回future對象
異步執行方法,順序輸出
注意:zip([1,2],[‘a’,’b’]) ==> [(1,’a’),(2,’b’)]