簡體   English   中英

GIL 是否使 Python 解釋器單線程或您的 python 代碼單線程

[英]Does GIL make the Python Interpreter single threaded or your python code single threaded

所以我一直在閱讀有關 GIL 的信息,但我無法做出某種微妙的區分。 Python 解釋器(C 進程)在持有 GIL 時是單線程的,還是解釋器可以是多線程的(使用多個內核,而不是 Python 線程概念),但只能解釋一個用戶級別的 Z23EEEB4343BDD5555 線程。

我正在考慮這個問題,因為我想知道用 Cython 編寫的 C 擴展是否沒有釋放 GIL,而是使用了多個線程,這些線程是否能夠在不同的內核上運行? 如果用戶 python 程序是單線程的並且調用 Cython 代碼進行一些長時間運行的操作,那么 Cython 代碼可以在多個內核上運行而無需釋放 GIL(假設沒有 python 交互)。 只有在調用它的 Python 代碼是多線程的情況下,Cython 代碼釋放 GIL 才重要,以便其他 Python 線程可以同時由解釋器執行,而 Cython 操作正在其他內核上運行?

全局解釋器鎖只是一把鎖。 這是一個必須持有才能與 CPython 實現機制的幾乎每個部分交互的鎖,包括 C API,但它不能做任何鎖不能做的事情。

GIL 不會自動阻止未獲取 GIL 的線程的並行執行。 這意味着 C 擴展可以並行運行多個線程,只要這些線程不嘗試持有 GIL 並且不做任何需要 GIL 的事情。

另一方面,GIL 不會自動啟用不需要 GIL 的線程的並行執行,如果這些線程無論如何都試圖持有 GIL。 特別是,如果您想在沒有 GIL 的情況下在 Cython 中編寫代碼,則必須顯式釋放 GIL

with nogil:
    ...

您還可以通過將nogil放入 function header 來將 function 標記為可以在沒有 GIL 的情況下安全調用:

cdef void my_gil_free_func(int spam) nogil:
    ...

暫無
暫無

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

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