GIL+死锁与递归锁+信号量+event事件
生活随笔
收集整理的這篇文章主要介紹了
GIL+死锁与递归锁+信号量+event事件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
GIL全局解釋器鎖:
GIL本質就是一把互斥鎖,相當于執行權限,每個進程內都會存在一把GIL,同一進程內的多個線程
必須搶到GIL之后才能使用Cpython解釋器來執行自己的代碼,即同一進程下的多個線程無法實現并行
但是可以實現并發
在Cpython解釋器下,如果想實現并行可以開啟多個進程
GIL存在的意義:
Cpython解釋器的垃圾回收機制不是線程安全的
死鎖:
是指兩個或兩個以上的進程或線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程
遞歸鎖:
在Python中為了支持在同一線程中多次請求同一資源,python提供了可重入鎖RLock。這個RLock內部維護著一個Lock和一個counter變量,
counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源.
信號量:
Semaphore管理一個內置的計數器,
每當調用acquire()時內置計數器-1;
調用release() 時內置計數器+1;
計數器不能小于0;當計數器為0時,acquire()將阻塞線程直到其他線程調用release()。
event事件:
線程的一個關鍵特性是每個線程都是獨立運行且狀態不可預測。如果程序中的其他線程需要通過判斷某個線程的狀態來確定自己下一步的操作,
這時線程同步問題就會變得非常棘手。為了解決這些問題,我們需要使用threading庫中的Event對象。 對象包含一個可由線程設置的信號標志,
它允許線程等待某些事件的發生。在 初始情況下,Event對象中的信號標志被設置為假。如果有線程等待一個Event對象,
而這個Event對象的標志為假,那么這個線程將會被一直阻塞直至該標志為真。一個線程如果將一個Event對象的信號標志設置為真,
它將喚醒所有等待這個Event對象的線程。如果一個線程等待一個已經被設置為真的Event對象,那么它將忽略這個事件, 繼續執行
轉載于:https://www.cnblogs.com/liangchengyang/p/9605941.html
總結
以上是生活随笔為你收集整理的GIL+死锁与递归锁+信号量+event事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《浪淘沙》第四句是什么
- 下一篇: AFN 切换BaseUrl