2013-02-17 13 views
5

Jestem nieco zdezorientowany, kiedy mam zadzwonić pod numer PyEval_InitThreads. Ogólnie rozumiem, że PyEval_InitThreads musi być wywoływany, gdy używany jest wątek inny niż Python (tj. Wątek utworzony w module rozszerzenia).Kiedy ma się nazywać PyEval_InitThreads?

Jednak jestem zdezorientowany, jeśli PyEval_InitThreads jest dla programów C, które osadzają interpreter Pythona, lub programy Python, które importują moduły rozszerzenia C, lub oba.

Tak więc, jeśli napiszę moduł rozszerzenia C, który będzie wewnętrznie uruchomić wątek, czy podczas inicjowania modułu muszę wywołać PyEval_InitThreads?

Również, PyEval_InitThreadsimplicitly acquires the Global Interpreter Lock. Więc po wywołaniu PyEval_InitThreads, prawdopodobnie GIL musi być wydany lub wystąpi impas. Jak zwolnić zamek? Po przeczytaniu dokumentacji, wydaje się, że jest to sposób na uwolnienie GIL. Jednak w praktyce, jeśli używam następujący kod w module rozszerzeń C:

PyEval_InitThreads(); 
    PyEval_ReleaseLock(); 

... następnie w czasie wykonywania Python przerywa się:

Fatal Python error: drop_gil: GIL is not locked 

Więc jak można zwolnić GIL po nabyciu to z PyEval_InitThreads?

+0

Spróbuj bez 'PyEval_ReleaseLock()'. GIL jest nabywany z ważnego powodu; zwolnienie go przed wywołaniem innych funkcji API C z Pythona ulegnie awarii. –

Odpowiedz

3

Większość aplikacji nigdy nie musi wiedzieć o PyEval_InitThreads().

Tylko czas należy użyć, jeśli jest to aplikacja osadzanie lub moduł rozszerzający będzie robić Python C wywołań API z więcej niż jednego wątku że zrodził sobie poza Pythona.

Nie wywołuj PyEval_ReleaseLock() w żadnym wątku, który będzie później wywoływał wywołania API Python C (chyba że ponownie je zdobędziesz przed tymi). W takim przypadku powinieneś zamiast tego używać makr Py_BEGIN_ALLOW_THREADS i Py_END_ALLOW_THREADS.

+1

Nie rozumiem tej odpowiedzi. Zakładając, że osadzasz Pythona w programie C i masz 20 wątków roboczych, którzy powinni wywoływać PyEval_InitThreads, i jak każdy pracownik zwalnia blokadę, gdy jest wyłączony, robiąc inne rzeczy, więc inne wątki, które muszą wykonać trochę pracy w Pythonie, mogą uzyskać GIL ? – DougN

+0

@DougN, zgadzam się. Odpowiedź jest niejasna (podobnie jak dokumenty Pythona). –

+2

Jeśli umieścisz program Python i C, wywołaj go raz dla całego programu, gdy zainicjujesz wbudowany interpreter języka Python, zanim wykonasz swój pierwszy kod Pythona. – gps

Powiązane problemy