he utilizado Py_NewInterpreter para diferentes intérpretes en diferentes hilos, pero esto también debería funcionar para varios intérpretes dentro de un hilo:
En el hilo principal:
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyEval_SaveThread();
Para cada instancia de intérprete (en cualquier hilo):
// 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
Tenga en cuenta que necesita una variable myThreadState para cada intérprete ¡ejemplo!
Finalmente la meta en el hilo principal:
PyEval_RestoreThread(mainThreadState);
Py_Finalize();
Hay algunas restricciones en el uso de varios casos de interpretación (que parecen no ser totalmente independiente), pero en la mayoría de los casos esto no parece causar problemas.
boost python usa python c apis. ¿es posible iniciar el intérprete dos veces llamando a Py_Initialize()? –