2014-11-01 30 views
1

當我使用兩個線程t1t2從Internet爬取某些東西,並將一些過濾的數據寫入單個文件時,我使用Lock()實例來確保只有一個線程正在寫入文件。我知道的是當t1.aquire()被調用時,t2.aquire()會將t2置於阻塞狀態。 我想知道的是,現在在Python解釋器中線程t2發生了什麼。解釋器會在每個時間段檢查線程的狀態嗎?而且,解釋器是控制分配給單個線程的CPU時間還是主機操作系統?線程在Python中阻塞時發生了什麼?

+0

有點offtop,但仍然解釋了很多關於蟒蛇跑步http://www.dabeaz.com/python/GIL.pdf – 2014-11-01 08:34:41

回答

0

任何系統調用都不可能中斷對鎖的acquire()方法。

獲取()

獲得鎖,阻塞或非阻塞的。

當不帶參數調用時(考慮t1):如果該線程已經擁有該鎖,則遞增遞歸級別,並立即返回。 否則,如果另一個線程擁有該鎖,則阻塞直到該鎖被解鎖。 一旦鎖定解鎖(不屬於任何線程),然後獲取所有權,設置遞歸級別爲1,然後返回。 如果有多個線程被阻塞,等待鎖定解鎖,則一次只能有一個線程能夠獲取該鎖的所有權。在這種情況下沒有返回值。

+0

謝謝,但我實際上知道你提到的東西,我想你在說話關於'RLock()'。我想弄清楚的是,當一個線程阻塞**時,場景下發生了什麼,我的意思是說有事件循環來定期檢查線程的阻塞狀態嗎? – Dragonly 2014-11-01 14:01:10

0

此問題的答案是特定於實現的(即取決於解釋器和操作系統)。在CPython中,每個Python線程都直接映射到OS線程,因此調度由OS控制。鎖定/解鎖也由OS處理,而不是解釋器。在Jython中,所有東西都在JVM下運行,JVM也將線程直接映射到本地線程。所以我不知道Python解釋器自己處理調度和鎖定的任何實現。

+0

非常感謝!你是否通過閱讀源代碼或某人的博客獲得了所有這些信息? – Dragonly 2014-11-01 14:04:44

+0

@DragonWarrior在我看來,閱讀文檔和書籍是學習的最佳方式。我不認爲源代碼或博客可以使用一致的知識來源。 – kraskevich 2014-11-01 14:32:43