मैं थोड़ा उलझन में हूं जब मुझे PyEval_InitThreads
पर कॉल करना है। आम तौर पर, मैं समझता हूं कि PyEval_InitThreads
को जब भी एक गैर-पायथन धागा (यानी एक थ्रेड जो एक विस्तार मॉड्यूल के भीतर उत्पन्न होता है) का उपयोग किया जाना चाहिए।PyEval_InitThreads कब कहा जाता है?
हालांकि, मैं उलझन में हूं अगर PyEval_InitThreads
सी प्रोग्रामों के लिए है जो पाइथन दुभाषिया, या पायथन कार्यक्रमों को एम्बेड करते हैं जो सी-एक्सटेंशन मॉड्यूल आयात करते हैं, या दोनों।
तो, यदि मैं एक सी एक्सटेंशन मॉड्यूल लिखता हूं जो आंतरिक रूप से थ्रेड लॉन्च करेगा, तो क्या मुझे मॉड्यूल प्रारंभ करते समय PyEval_InitThreads
पर कॉल करने की आवश्यकता है?
इसके अलावा, PyEval_InitThreads
implicitly acquires the Global Interpreter Lock। तो PyEval_InitThreads
पर कॉल करने के बाद, संभवतः जीआईएल जारी किया जाना चाहिए या डेडलॉक आ जाएगा। तो आप लॉक कैसे जारी करते हैं? प्रलेखन पढ़ने के बाद, PyEval_ReleaseLock()
जीआईएल जारी करने का तरीका प्रतीत होता है। हालाँकि, व्यवहार में, अगर मैं एक सी विस्तार मॉड्यूल में निम्न कोड का उपयोग करें:
PyEval_InitThreads();
PyEval_ReleaseLock();
... तो कार्यावधि में अजगर के साथ रोकता:
Fatal Python error: drop_gil: GIL is not locked
तो आपको कैसे जीआईएल प्राप्त करने के बाद जारी है यह PyEval_InitThreads
के साथ है?
'PyEval_ReleaseLock()' के बिना प्रयास करें। जीआईएल एक अच्छे कारण के लिए अधिग्रहित किया गया है; पायथन से अन्य सी एपीआई कार्यों को कॉल करने से पहले इसे जारी करना दुर्घटनाग्रस्त हो रहा है। –