python 之 GIL(线程和进程的应用)
一、GIL:http://www.tuicool.com/articles/7zIra2r
?http://www.zhihu.com/question/23474039
二、線程鎖
在threading模塊中,定義兩種類型的鎖:threading.Lock和threading.RLock。它們之間有一點細微的區別,通過比較下面兩段代碼來說明:
這兩種瑣的主要區別是:RLock允許在同一線程中被多次acquire。而Lock卻不允許這種情況。注意:如果使用RLock,那么acquire和release必須成對出現,即調用了n次acquire,必須調用n次的release才能真正釋放所占用的鎖。threading.Condition
可以把Condiftion理解為一把高級的鎖,它提供了比Lock, RLock更高級的功能,允許我們能夠控制復雜的線程同步問題。threadiong.Condition在內部維護一個鎖對象(默認是RLock),可以在創建Condigtion對象的時候把鎖對象作為參數傳入。Condition也提供了acquire, release方法,其含義與鎖的acquire, release方法一致,其實它只是簡單的調用內部鎖對象的對應的方法而已。Condition還提供了如下方法(特別要注意:這些方法只有在占用鎖(acquire)之后才能調用,否則將會報RuntimeError異常。):
Condition.wait([timeout]):??
wait方法釋放內部所占用的鎖,同時線程被掛起,直至接收到通知被喚醒或超時(如果提供了timeout參數的話)。當線程被喚醒并重新占有鎖的時候,程序才會繼續執行下去。
Condition.notify():
喚醒一個掛起的線程(如果存在掛起的線程)。注意:notify()方法不會釋放所占用的鎖。
Condition.notify_all()
Condition.notifyAll()
喚醒所有掛起的線程(如果存在掛起的線程)。注意:這些方法不會釋放所占用的鎖。
三、注意事項
Python由于有全鎖局的存在(同一時間只能有一個線程執行),并不能利用多核優勢。所以,如果你的多線程進程是CPU密集型的,那多線程并不能帶來效率上的提升,相反還可能會因為線程的頻繁切換,導致效率下降;如果是IO密集型,多線程進程可以利用IO阻塞等待時的空閑時間執行其他線程,提升效率。轉載于:https://www.cnblogs.com/work115/p/5625837.html
總結
以上是生活随笔為你收集整理的python 之 GIL(线程和进程的应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql安装中出现的问题,
- 下一篇: websocket python爬虫_p