python-多線程的同步方式


python 中多線程實現是表象,本質任然是切分時間片;
從操作系統上來看,python中多線程,本質上是利用cpu空間時間實現,但並非是真正意義上的並行執行

線程是指進程內的一個執行單元,也是進程內的可調度實體.

與進程的區別:
(1) 地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
(2) 資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3) 線程是處理器調度的基本單位,但進程不是.
(4) 二者均可並發執行.

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

線程的划分尺度小於進程,使得多線程程序的並發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

線程間同步

多個線程,共同對某個數據修改,可能出現不可預料的結果,為保證數據的正確性,需要實現線程的同步。
線程同步的幾種方式:

使用Thread對象的Lock和RLock,實現簡單線程同步,這兩個對象都有acquire和release方法,對於
每次只允許一個線程操作的數據,可以將獲取鎖的方法,保證線程的同步;
Note: Python 有一個GIL(Global Interpreter Lock)機制, 任何線程運行之前必須獲取這個
全局鎖, 每當執行完100條字節碼,全局鎖才會釋放,切換到其他線程。
1、鎖機制
2、線程同步隊列queue

線程池

傳統多線程問題?
傳統多線程,使用“及時創建, 即時銷毀”的策略。雖然創建線程時間大大縮短,但是提交給線程的任務執行
時間較短,而且執行次數及其頻繁,那么服務器將處於不停創建線程,銷毀線程狀態。

一個線程運行時間分為三部分:啟動,執行,銷毀。
多線程場景中,如果線程不能被重用,每次線程都經過,啟動,執行,銷毀3個過程,會增加系統相應時間,降低
效率。
線程池原理:

將任務放進隊列之中, 然后開N個線程, 每個線程都去隊列中取一個任務,執行完之后告訴系統,接着去隊列中取
下一個任務,直到隊列為空,退出線程。

線程池設置多少?
線程執行,計算時間分為兩部分:
1、 cpu計算,占用cpu
2、不需要cpu計算,不占用cpu,等待IO返回,eg:recv(), sleep()等
N核服務器,執行業務單線層分析出本地計算時間x, 等待時間y
工作線程數:N*(x+y)/x,能讓cpu利用率最大化。

參考連接: https://blog.csdn.net/daiyu__zz/article/details/81912018


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM