簡體   English   中英

對Python bytearray的多線程訪問

[英]Multithreaded Access to Python bytearray

看來,由於訪問NumPy數組數據不需要調用Python解釋器,C擴展可以在釋放GIL后操作這些數組。 例如,在這個帖子中

內置的Python類型bytearray支持緩沖協議 ,其中一個成員是

void * buf

指向緩沖區字段描述的邏輯結構的開始的指針。 [...]對於連續數組,該值指向內存塊的開頭。

我的問題是,在發布GIL(Py_BEGIN_ALLOW_THREADS)后,C擴展是否可以操作此buf ,因為訪問它不再需要調用Python C API? 或者Python垃圾收集器的性質是否禁止這樣做,因為在執行期間可能會移動bytearray及其buf?

為了澄清作為注釋寫的簡短答案:您可以在不保存GIL的情況下訪問* buf數據,前提是您確定Py_buffer結構在沒有GIL的情況下由線程“擁有”。

為了完整起見,我應該補充一點,這可能會打開(非常遠程)崩潰風險的大門:如果無GIL線程在* buf讀取數據,同時另一個GIL持有線程正在運行Python代碼更改相同的數據(bytearray [index] = x),然后無GIL的線程可以看到其腳下數據的意外更改。 相反的情況也是如此,甚至更煩人(但仍然是理論上的):如果無GIL的線程在* buf處更改數據,那么其他持有GIL的,運行Python的線程可能會看到奇怪的結果,甚至可能會在執行某些操作時崩潰復雜的讀取操作,如bytearray.split()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM