मैं अलग धागे में विभिन्न दुभाषियों के लिए Py_NewInterpreter का इस्तेमाल किया है, लेकिन यह भी एक थ्रेड के भीतर कई दुभाषियों के लिए काम करना चाहिए:
मुख्य थ्रेड में:
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyEval_SaveThread();
प्रत्येक दुभाषिया उदाहरण के लिए (किसी भी धागे में):
// 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
ध्यान दें कि आपको प्रत्येक दुभाषिया के लिए एक चर MyThreadState की आवश्यकता है उदाहरण!
अंत में मुख्य थ्रेड में खत्म:
PyEval_RestoreThread(mainThreadState);
Py_Finalize();
वहाँ कई दुभाषिया उदाहरणों का प्रयोग करते हैं (वे पूरी तरह से स्वतंत्र नहीं होने लगते हैं) के साथ कुछ प्रतिबंध हैं, लेकिन ज्यादातर मामलों में यह समस्याएं पैदा करने के लिए नहीं लगता है।
बूस्ट पायथन पाइथन सी एपिस का उपयोग करता है। क्या Py_Initialize() को कॉल करके दो बार दुभाषिया शुरू करना संभव है? –