मैं एक बहुप्रचारित सी अनुप्रयोग में पायथन दुभाषिया एम्बेड कर रहा हूं और मैं थोड़ी उलझन में हूं कि थ्रेड सुरक्षा सुनिश्चित करने के लिए मुझे किन एपीआई का उपयोग करना चाहिए।मल्टीथ्रेडेड सी अनुप्रयोग में पाइथन एम्बेड करना
जो मैंने एकत्र किया है, जब से मैं पाइथन एम्बेड करता हूं, यह किसी भी अन्य पायथन सी एपीआई कॉल को कॉल करने से पहले जीआईएल लॉक की देखभाल करने के लिए एम्बेडर पर निर्भर करता है। यह इन कार्यों के साथ किया जाता है:
gstate = PyGILState_Ensure();
// do some python api calls, run python scripts
PyGILState_Release(gstate);
लेकिन यह अकेला पर्याप्त प्रतीत नहीं होता है। मुझे अभी भी यादृच्छिक दुर्घटनाएं मिली हैं क्योंकि यह पाइथन एपीआई के लिए आपसी बहिष्करण प्रदान नहीं कर रही है।
कुछ और डॉक्स मैं यह भी कहा पढ़ने के बाद:
PyEval_InitThreads();
सही Py_IsInitialized()
करने के लिए कॉल के बाद, लेकिन वह जहां भ्रामक हिस्सा आता है। डॉक्स राज्य इस समारोह है कि:
प्रारंभ और वैश्विक दुभाषिया ताला
यह पता चलता है कि जब इस समारोह रिटर्न, गिल माना जाता है बंद किया जा करने के लिए और किसी भी तरह को अनलॉक कर दिया जाना चाहिए प्राप्त करते हैं। लेकिन व्यवहार में यह आवश्यक प्रतीत नहीं होता है। इस लाइन के साथ मेरी बहुप्रचारित पूरी तरह से काम करती है और पारस्परिक बहिष्कार PyGILState_Ensure/Release
कार्यों द्वारा बनाए रखा गया था।
जब मैंने PyEval_ReleaseLock()
PyEval_ReleaseLock()
के बाद PyEval_ReleaseLock()
जोड़ने की कोशिश की तो ऐप PyImport_ExecCodeModule()
पर बाद में कॉल में बहुत जल्दी लॉक हो गया।
तो मैं यहां क्या खो रहा हूं?
यह गलत और संभावित रूप से हानिकारक है: 'PyEval_SaveThread' हमेशा' PyEval_RestoreThread' के संयोजन के साथ होना चाहिए। जैसा कि [कहीं और समझाया गया है] (http://stackoverflow.com/a/15471525/1600898), आपको इसे प्रारंभ करने के बाद लॉक को रिलीज़ करने का प्रयास नहीं करना चाहिए; इसे अपने नियमित काम के हिस्से के रूप में रिलीज़ करने के लिए इसे पायथन पर छोड़ दें। – user4815162342
मुझे नहीं लगता कि यह हानिकारक क्यों है यदि आप सभी कॉल को _Block_ _Allow_ ब्लॉक में पाइथन में डालते हैं। दूसरी तरफ, यदि आप 'PyEval_SaveThread();' नहीं कहते हैं, तो आपका मुख्य धागा अन्य धागे की पहुंच को पायथन तक अवरुद्ध कर देगा। दूसरे शब्दों में 'PyGILState_Ensure() 'deadlocks। – khkarens
यह एकमात्र चीज है जो दोनों पायथन को एम्बेड करने और एक्सटेंशन मॉड्यूल में कॉल करने के लिए काम करती है। –