2017-07-08 87 views
1

我讀通過Grok The GIL,它有大約鎖定在討論下面的語句。瞭解搶佔式多任務與鎖和Python的GIL?

只要當它睡覺沒有線程持有鎖,並I/O,或其他一些GIL-下垂動作,你應該使用最粗,最簡單的鎖定成爲可能。無論如何,其他線程無法並行運行。

它剛剛討論了搶先式多任務處理。什麼能防止在你鎖定時發生GIL的搶先丟棄?或者這不是這個陳述所指的?

回答

0

我問片的作者,它丟棄GIL,因爲你是進行外部操作,等待VS內部preemtion之間歸結爲差:https://opensource.com/article/17/4/grok-gil#comment-136186

嗨!沒有什麼能阻止一個線程搶先丟棄GIL而 它持有的鎖。讓我們把線程A,並假設也 有一個線程B.如果線程A持有鎖和被搶佔,那麼也許 線程B可以運行,而不是線程A

如果線程B等待鎖該線程A被保持,然後線程B是等待GIL。在這種情況下,線程A在刪除它之後立即重新獲取GIL,並且線程A繼續。

如果線程B未在等待線程A持有的鎖定 ,則線程B可能會獲取GIL 並運行。

然而,我關於粗略鎖定的觀點是:由於GIL,沒有兩個線程可以並行執行Python。因此,使用 細粒度鎖不會提高吞吐量。這是相對於 如Java或C,其中細粒度鎖允許更大 並行,因此,更大的吞吐量的語言。

我還需要一些澄清,他沒有證實這一點:

如果我正確理解您的說法我引用的目的是爲了避免使用外部周圍鎖操作,在那裏你然後可以阻止多個線程,如果他們都依賴於該鎖。

對於搶佔例如,線程A是不會被任何外部的,所以處理只是去來回類似的合作多任務處理。