Освобождение GIL после уничтожения суб-переводчика - PullRequest
3 голосов
/ 21 марта 2011

Я встраиваю Python 3.2 в приложение C ++, и у меня есть несколько вспомогательных интерпретаторов, которые в разное время выполняются в программах (созданных Py_NewInterpreter). Они получают и выпускают GIL в разное время, но я столкнулся с проблемой, когда хочу уничтожить одного из подчиненных интерпретаторов.

Чтобы уничтожить подчиненного переводчика, вы должны приобрести GIL. Итак, я делаю это:

PyEval_AcquireLock(threadstate);

Тогда я уничтожу переводчика с

Py_EndInterpreter(threadstate);

И вы могли бы подумать, что это высвободит GIL, потому что то, что держало его, было уничтожено. Тем не менее, документация для Py_EndInterpreter гласит:

Данное состояние потока должно быть текущее состояние потока. Увидеть обсуждение состояний потоков ниже. Когда звонок возвращается, текущий состояние потока равно NULL. (Глобальная блокировка интерпретатора должна удерживаться перед вызовом этой функции и по-прежнему удерживаться при ее возврате.)

Так что, если мне нужно удерживать GIL, когда я уничтожаю подчиненный интерпретатор, и уничтожение подчиненного интерпретатора устанавливает его в NULL, и у меня должен быть поток, который получил GIL, чтобы освободить его, как мне освободить GIL после уничтожения суб-переводчик?

1 Ответ

2 голосов
/ 21 марта 2011

Что произойдет, если вы позвоните PyEval_ReleaseLock() сразу после того, как позвоните Py_EndInterpreter()?Это то, что документы говорят вам делать в любом случае.:)

...