#python #c #multithreading #gil
#python #c #многопоточность #gil
Вопрос:
У меня есть программа на python, которая обращается к библиотеке c , которая хочет снять все блокировки python, чтобы могли выполняться другие потоки python.
Используя PyEval_SaveThread
и PyEval_ReleaseThread
, я получаю ошибки о том, что состояние потока равно НУЛЮ:
Fatal Python error: PyEval_SaveThread: NULL tstate
Однако функция более низкого уровня, похоже, с радостью принимает нулевое состояние:
PyThreadState *s;
s = PyThreadState_Swap(NULL);
// (now s = 0)
PyEval_ReleaseLock();
// ....
PyEval_AcquireLock();
PyThreadState_Swap(s);
// everything seems to be just fine :)
Ответ №1:
Ответ: нет, это никогда не должно быть NULL
(если это так, то это фатальная ошибка). Оказалось, это было потому, что я связывался с двумя разными версиями python, одной через boost_python, а другой напрямую.
Главный совет: используйте ldd
or otool -L
для проверки зависимостей вашей библиотеки, когда происходят забавные вещи 😉