Я играю с C API для Python, но довольно сложно понять некоторые угловые случаи. Я мог бы протестировать его, но он, похоже, подвержен ошибкам и требует много времени. Поэтому я прихожу сюда, чтобы убедиться, что кто-то уже это сделал.
Вопрос в том, что это правильный способ управления многопоточным с суб-интерпретаторами без прямой связи между потоками и суб-интерпретаторами?
Py_Initialize();
PyEval_InitThreads(); /* <-- needed? */
_main = PyEval_SaveThread(); /* <-- acquire lock? does it matter? */
/* maybe do I not need it? */
i1 = Py_NewInterpreter();
i2 = Py_NewInterpreter();
Я использую мьютекс? Требуется использовать замки? Функция threaded должна выглядеть примерно так: (Нити - это не-python, возможно, потоки POSIX)
Резьба1
_save = PyThreadState_Swap(i1);
// python work
PyThreadState_Restore(_save);
Thread2 (почти идентичный)
_save = PyThreadState_Swap(i1);
// python work
PyThreadState_Restore(_save);
Thread3 (почти идентичный, но с суб-интерпретатором i2
)
_save = PyThreadState_Swap(i2);
// python work
PyThreadState_Restore(_save);
Это правильно? Это общий случай, который я хочу достичь? Существуют ли условия гонки?
Спасибо!