I stosuje Py_NewInterpreter różnych tłumaczy w różne gwinty, ale również powinny działać na kilku tłumaczy ciągu nici:
W głównym gwintem:
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyEval_SaveThread();
W każdym przypadku interpretera (w dowolnym wątku):
// initialize interpreter
PyEval_AcquireLock(); // get the GIL
myThreadState = Py_NewInterpreter();
... // call python code
PyEval_ReleaseThread(myThreadState); // swap out thread state + release the GIL
... // any other code
// continue with interpreter
PyEval_AcquireThread(myThreadState); // get GIL + swap in thread state
... // call python code
PyEval_ReleaseThread(myThreadState);
... // any other code
// finish with interpreter
PyEval_AcquireThread(myThreadState);
... // call python code
Py_EndInterpreter(myThreadState);
PyEval_ReleaseLock(); // release the GIL
Pamiętaj, że potrzebujesz zmiennej myThreadState dla każdego tłumacza instancja!
końcu wykończenie w głównym wątku:
PyEval_RestoreThread(mainThreadState);
Py_Finalize();
Istnieją pewne ograniczenia w zastosowaniu kilku wystąpień tłumacza (wydają się nie być całkowicie niezależne), ale w większości przypadków to nie wydaje się być przyczyną problemów.
Dodatkowy python używa python c apis. czy można uruchomić interpreter dwukrotnie, wywołując Py_Initialize()? –