2013-02-17 51 views
5

मैं थोड़ा उलझन में हूं जब मुझे PyEval_InitThreads पर कॉल करना है। आम तौर पर, मैं समझता हूं कि PyEval_InitThreads को जब भी एक गैर-पायथन धागा (यानी एक थ्रेड जो एक विस्तार मॉड्यूल के भीतर उत्पन्न होता है) का उपयोग किया जाना चाहिए।PyEval_InitThreads कब कहा जाता है?

हालांकि, मैं उलझन में हूं अगर PyEval_InitThreads सी प्रोग्रामों के लिए है जो पाइथन दुभाषिया, या पायथन कार्यक्रमों को एम्बेड करते हैं जो सी-एक्सटेंशन मॉड्यूल आयात करते हैं, या दोनों।

तो, यदि मैं एक सी एक्सटेंशन मॉड्यूल लिखता हूं जो आंतरिक रूप से थ्रेड लॉन्च करेगा, तो क्या मुझे मॉड्यूल प्रारंभ करते समय PyEval_InitThreads पर कॉल करने की आवश्यकता है?

इसके अलावा, PyEval_InitThreadsimplicitly acquires the Global Interpreter Lock। तो PyEval_InitThreads पर कॉल करने के बाद, संभवतः जीआईएल जारी किया जाना चाहिए या डेडलॉक आ जाएगा। तो आप लॉक कैसे जारी करते हैं? प्रलेखन पढ़ने के बाद, PyEval_ReleaseLock() जीआईएल जारी करने का तरीका प्रतीत होता है। हालाँकि, व्यवहार में, अगर मैं एक सी विस्तार मॉड्यूल में निम्न कोड का उपयोग करें:

PyEval_InitThreads(); 
    PyEval_ReleaseLock(); 

... तो कार्यावधि में अजगर के साथ रोकता:

Fatal Python error: drop_gil: GIL is not locked 

तो आपको कैसे जीआईएल प्राप्त करने के बाद जारी है यह PyEval_InitThreads के साथ है?

+0

'PyEval_ReleaseLock()' के बिना प्रयास करें। जीआईएल एक अच्छे कारण के लिए अधिग्रहित किया गया है; पायथन से अन्य सी एपीआई कार्यों को कॉल करने से पहले इसे जारी करना दुर्घटनाग्रस्त हो रहा है। –

उत्तर

3

अधिकांश अनुप्रयोगों को कभी भी PyEval_InitThreads() के बारे में जानने की आवश्यकता नहीं है।

आपको इसका उपयोग करने का एकमात्र समय यह है कि यदि आपका एम्बेडिंग एप्लिकेशन या एक्सटेंशन मॉड्यूल एक से अधिक थ्रेड से पाइथन सी एपीआई कॉल करेगा, तो उसने पाइथन के बाहर को स्वयं बनाया है।

किसी भी धागे में PyEval_ReleaseLock() पर कॉल न करें जो बाद में पाइथन सी एपीआई कॉल कर देगा (जब तक कि आप इसे पहले से प्राप्त नहीं करते)। उस स्थिति में आपको वास्तव में Py_BEGIN_ALLOW_THREADS और Py_END_ALLOW_THREADS मैक्रोज़ का उपयोग करना चाहिए।

+1

मुझे यह जवाब नहीं समझा। मान लें कि आप एक सी प्रोग्राम में पायथन को एम्बेड कर रहे हैं, और आपके पास 20 कार्यकर्ता धागे हैं, जिन्हें PyEval_InitThreads को कॉल करना चाहिए, और प्रत्येक कार्यकर्ता लॉक को अन्य चीजों को बंद करने के दौरान कैसे जारी करता है, इसलिए कुछ पाइथन जो कुछ पायथन काम करने की आवश्यकता होती है, जीआईएल प्राप्त कर सकती है ? – DougN

+0

@DougN, हाँ मैं सहमत हूं। जवाब अस्पष्ट है (जैसा कि पाइथन डॉक्स स्वयं दुर्भाग्य से हैं) –

+2

यदि आप पाइथन i एक सी प्रोग्राम एम्बेड कर रहे हैं, तो इसे अपने पूरे पायथन कोड को निष्पादित करने से पहले अपने एम्बेडेड पायथन दुभाषिया को प्रारंभ करने के बाद इसे एक बार कॉल करें। – gps

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^