當我使用兩個線程t1
和t2
從Internet爬取某些東西,並將一些過濾的數據寫入單個文件時,我使用Lock()實例來確保只有一個線程正在寫入文件。我知道的是當t1.aquire()
被調用時,t2.aquire()
會將t2
置於阻塞狀態。 我想知道的是,現在在Python解釋器中線程t2
發生了什麼。解釋器會在每個時間段檢查線程的狀態嗎?而且,解釋器是控制分配給單個線程的CPU時間還是主機操作系統?線程在Python中阻塞時發生了什麼?
回答
任何系統調用都不可能中斷對鎖的acquire()方法。
獲取()
獲得鎖,阻塞或非阻塞的。
當不帶參數調用時(考慮t1):如果該線程已經擁有該鎖,則遞增遞歸級別,並立即返回。 否則,如果另一個線程擁有該鎖,則阻塞直到該鎖被解鎖。 一旦鎖定解鎖(不屬於任何線程),然後獲取所有權,設置遞歸級別爲1,然後返回。 如果有多個線程被阻塞,等待鎖定解鎖,則一次只能有一個線程能夠獲取該鎖的所有權。在這種情況下沒有返回值。
謝謝,但我實際上知道你提到的東西,我想你在說話關於'RLock()'。我想弄清楚的是,當一個線程阻塞**時,場景下發生了什麼,我的意思是說有事件循環來定期檢查線程的阻塞狀態嗎? – Dragonly 2014-11-01 14:01:10
此問題的答案是特定於實現的(即取決於解釋器和操作系統)。在CPython中,每個Python線程都直接映射到OS線程,因此調度由OS控制。鎖定/解鎖也由OS處理,而不是解釋器。在Jython中,所有東西都在JVM下運行,JVM也將線程直接映射到本地線程。所以我不知道Python解釋器自己處理調度和鎖定的任何實現。
非常感謝!你是否通過閱讀源代碼或某人的博客獲得了所有這些信息? – Dragonly 2014-11-01 14:04:44
@DragonWarrior在我看來,閱讀文檔和書籍是學習的最佳方式。我不認爲源代碼或博客可以使用一致的知識來源。 – kraskevich 2014-11-01 14:32:43
- 1. 當一個線程被阻塞時,其他線程會發生什麼?
- 2. 當一個線程在wait()上阻塞時被中斷會發生什麼?
- 3. python爲什麼在一個線程中真正阻塞另一個線程
- 4. 爲什麼Task.Factory.FromAsync阻塞UI線程?
- 5. 爲什麼Handler.Post阻塞主線程
- 6. 確定什麼是阻塞UI線程
- 7. 在.Net中阻塞線程
- 8. 阻止阻塞的線程阻塞
- 9. 在Linux中發生死Java線程發生了什麼?
- 10. 爲什麼單獨線程中的TidTCPClient阻塞主線程?
- 11. 爲什麼線程在我使用Apache-Commons-Pool時被阻塞?
- 12. 爲什麼NSTimer在另一個線程運行時被阻塞?
- 13. GC在用戶線程中踢球時發生了什麼?
- 14. Python:爲什麼recv()在阻塞模式下沒有阻塞?
- 15. 爲什麼我的python線程互相阻塞
- 16. 將線程阻塞轉換爲f中的非線程阻塞#
- 17. 什麼時候FileInputStream.read()阻塞?
- 18. 阻塞的線程是否會導致進程阻塞?爲什麼和如何?
- 19. 阻塞隊列不阻塞線程?
- 20. 當executorservice關閉時,運行/阻塞的runnables會發生什麼()
- 21. 在python中發生了什麼b = a [:]?
- 22. MessageBeep線程阻塞
- 23. 阻塞線程 - Java
- 24. 非阻塞線程
- 25. Java線程阻塞
- 26. 爲什麼我的後臺工作線程阻塞UI線程?
- 27. 爲什麼主線程的Looper.loop()不會阻塞UI線程?
- 28. 中止阻塞線程
- 29. 阻塞線程中斷
- 30. 爲什麼我的異步計時器阻塞UI線程?
有點offtop,但仍然解釋了很多關於蟒蛇跑步http://www.dabeaz.com/python/GIL.pdf – 2014-11-01 08:34:41