6

बस इसके बेहद कमर के लिए, मैंने Scheme binding to libpython बनाने का निर्णय लिया है ताकि आप योजना कार्यक्रमों में पायथन एम्बेड कर सकें। मैं पहले से ही पाइथन के सी एपीआई में कॉल करने में सक्षम हूं, लेकिन मैंने वास्तव में स्मृति प्रबंधन के बारे में सोचा नहीं है।सी कोड से निपटने के दौरान कोई पाइथन संदर्भ गिनती/कचरा संग्रहण गेटचास है?

जिस तरह से mzscheme का एफएफआई काम करता है यह है कि मैं एक फ़ंक्शन कॉल कर सकता हूं, और यदि वह फ़ंक्शन PyObject पर पॉइंटर लौटाता है, तो मैं इसे संदर्भ गणना को स्वचालित रूप से बढ़ा सकता हूं। फिर, मैं एक फाइनलाइज़र पंजीकृत कर सकता हूं जो योजना वस्तु को कचरा इकट्ठा होने पर संदर्भ गणना में कमी आएगी। मैंने documentation for reference counting पर देखा है, और पहली नज़र में इसके साथ कोई समस्या नहीं दिख रही है (हालांकि यह कुछ मामलों में उप-इष्टतम हो सकती है)। क्या कोई गठजोड़ है जो मुझे याद आ रही है?

इसके अलावा, मुझे cyclic garbage collector documentation के सिर या पूंछ बनाने में परेशानी हो रही है। मुझे यहां क्या बातों को ध्यान में रखना होगा? विशेष रूप से, मैं पाइथन को कैसे जागरूक करता हूं कि मेरे पास कुछ संदर्भ है, इसलिए जब भी मैं इसका उपयोग कर रहा हूं, यह इसे एकत्र नहीं करता है?

उत्तर

7

http://docs.python.org/extending/extending.html#reference-counts पर आपका लिंक सही जगह है। प्रलेखन के विस्तार और एम्बेडिंग और पायथन/सी एपीआई अनुभाग वे हैं जो सी एपीआई का उपयोग कैसे करें।

संदर्भ गणना सी एपीआई का उपयोग करने के कष्टप्रद हिस्सों में से एक है। मुख्य गोचा सीधे सब कुछ रख रहा है: आपके द्वारा कॉल किए गए एपीआई फ़ंक्शन के आधार पर, आप जिस ऑब्जेक्ट को प्राप्त करते हैं उसके संदर्भ में हो सकता है या नहीं। यह समझने के लिए सावधान रहें कि क्या आप इसका स्वामी हैं (और इस प्रकार इसे DECREF को भूलना नहीं भूल सकते हैं या इसे चोरी करने वाले किसी चीज़ को दे सकते हैं) या इसे उधार ले रहे हैं (और इसे अपने कार्य के दौरान इसे संभवतः उपयोग करने के लिए इसे शामिल करना चाहिए)। इसमें शामिल सबसे आम बग 1) गलत तरीके से याद कर रहे हैं कि क्या आप किसी विशेष फ़ंक्शन द्वारा संदर्भित संदर्भ के स्वामी हैं और 2) मानते हैं कि आप लंबे समय से संदर्भ के लिए एक संदर्भ उधार लेना सुरक्षित हैं।

आपको चक्रीय कचरा कलेक्टर के लिए कुछ भी विशेष करने की ज़रूरत नहीं है। संदर्भ गणना में एक दोष लगाने के लिए यह सिर्फ वहां है और प्रत्यक्ष पहुंच की आवश्यकता नहीं है।

+0

तो ... पाइथन संदर्भ गणना * और * चक्रीय संरचना के लिए एक कचरा कलेक्टर का उपयोग करता है? यह एक बहुत बड़ी दोष है। डिजाइन प्रकार। किसी भी मामले में, ऐसा लगता है जैसे यह जेसन के लिए चीजों को और अधिक "मजेदार" बना देगा, अगर किसी अजगर-साइड चक्र में भाग लेने वाले किसी भी मूल्य योजना के संपर्क में आते हैं। –

+0

अच्छी जानकारी। जब तक मैं इसे प्राप्त करता हूं, जब तक मैं इसे प्राप्त करता हूं और जब भी मैं इसके साथ काम करता हूं, तो मुझे सब कुछ ठीक कर लेना चाहिए, क्या मुझे ठीक होना चाहिए? या क्या कोई समस्या है जिसमें मैं भाग सकता हूं? –

+2

@ जेसन, केवल INCREF * उधार * संदर्भ। कुछ फ़ंक्शन * नए * संदर्भ लौटाते हैं जो पहले से ही शामिल हैं। उन्हें शामिल करने के परिणामस्वरूप स्मृति रिसाव होगा। –

3

सबसे बड़ी गॉचा मुझे रेफ गिनती के साथ पता है और सी एपीआई __del__ चीज है। जब आपके पास कुछ उधार लिया गया संदर्भ होता है, तो आपको लगता है कि आप बिना किसी बदलाव के दूर हो सकते हैं क्योंकि आप उस संदर्भ का उपयोग करते समय जीआईएल को नहीं छोड़ते हैं। लेकिन, यदि आप किसी ऑब्जेक्ट को हटाते हैं (उदाहरण के लिए, इसे किसी सूची से हटाकर), तो यह संभव है कि आप __del__ कॉल को ट्रिगर करें, जो आपके पैर के नीचे से उधार लेने वाले संदर्भ को हटा सकता है। बहुत मुश्किल

यदि आप इन्हें प्राप्त करते समय सभी उधार संदर्भों को शामिल करते हैं (और फिर निश्चित रूप से DECREF), तो कोई समस्या नहीं होनी चाहिए।

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