2013-03-26 77 views
1

我很好奇。我一直在Python編程多年。當我運行阻塞I/O的命令(無論是硬盤讀取還是網絡請求),還是等待鎖定發佈時阻塞時,該如何實現?線程如何知道何時重新獲取GIL並重新開始運行?如何等待I/O或等待鎖釋放實施?

我想知道這是否通過不斷檢查(「現在是輸出嗎?現在呢?現在呢?現在呢?」),我認爲這是浪費,或者更優雅的方式。

+0

我不是Python開發人員,所以請帶上一點鹽的評論。 I/O執行由操作系統執行,語言運行時只是圍繞它執行。 Windows例如總是提供同步I/O操作,但運行時提供了在單獨的線程上運行I/O的方法。這些線程本身使用中斷來通知數據。類似的事情應該與鎖。如果鎖定被釋放,則檢查執行,如果不是,CPU將退回到運行不同線程一段時間的OS調度程序,並返回控制以定期鎖定檢查代碼。 – 2013-03-26 19:23:15

回答

0

無需重複檢查I/O完成或鎖定釋放。

一個I/O完成,通過硬件中斷傳遞給驅動程序,或者通過另一個線程的軟件中斷傳遞鎖定釋放,將使線程立即「等待」這些操作,並且很可能正在運行,並且很有可能在運行時搶佔另一個線程。實質上,在軟件或硬件中斷之後,操作系統可以決定中斷返回到不同於中斷的線程。

這個機制的高I/O性能,消除了任何輪詢或檢查,是承受前置多任務處理器痛苦的99%。