2012-08-07 15 views
6

के लिए साझा और अनन्य नामित लॉक मुझे नामित लॉक (उदाहरण के लिए फ़ाइल लॉक) के साथ पाइथन थ्रेड और प्रक्रियाओं (एक दूसरे से संबंधित आवश्यक नहीं) सिंक्रनाइज़ करने की आवश्यकता है। अधिमानतः यह पाठकों-लेखक ताला होना चाहिए। मैं fcntl.flock की कोशिश की है (यह दोनों अनन्य और साझा ताला अधिग्रहण किया है), लेकिन यह ताला लगा के वांछित स्तर प्रदान नहीं करता है - Does python's fcntl.flock function provide thread level locking of file access?पायथन

मेरे समाधान अब तक memcached (या mmap'ed बंद कर दिया फ़ाइल) के साथ lockfile उपयोग करने के लिए है। लॉकफाइल एक्सेस सिंक्रनाइज़ करेगा और memcached पाठकों/लेखकों की गणना करेगा।

क्या कोई बेहतर/तेज समाधान है? क्या आप किसी भी परियोजना को जानते हैं जो पहले से ही इस समस्या को हल करता है?

+0

मुझे किसी भी समाधान में रुचि होगी। – cji

+0

कोशिश करें [ilock] (https://github.com/symonsoft/ilock) लाइब्रेरी – Symon

उत्तर

2

यहां एक लिंक http://semanchuk.com/philip/ है जो पॉज़िक्स और सिस्टम वी सेमफोरस को लागू करने वाले पुस्तकालयों के साथ है। आप उनमें से एक का उपयोग कर सकते हैं। सावधान रहें हालांकि ऐसी परिस्थिति में जब सेमफोर पकड़े जाने की प्रक्रिया इसे जारी किए बिना मर जाती है - अन्य सभी अटक जाते हैं। यदि आप इससे डरते हैं - आप यूएनडीओ के साथ सिस्टम वी सेमफोरस का उपयोग कर सकते हैं लेकिन वे थोड़ा धीमे हैं। इसके अलावा यदि आप सिस्टम वी साझा स्मृति प्राइमेटिव्स का उपयोग करने के लिए होते हैं - याद रखें कि वे कर्नेल में रहते हैं और प्रक्रिया समाप्त होने के बाद जीते रहते हैं - आपको उन्हें सिस्टम से स्पष्ट रूप से निकालना होगा।

आप प्रक्रियाओं और पूरी प्रणाली और प्रक्रियाओं के गतिरोध मरने से डर से संबंधित हैं नहीं कर रहे हैं - (। वे POSIX नामित संकेतबाहु कर रहे हैं) आप अजगर के Semaphores इस्तेमाल कर सकते हैं

पेज आप संबंधित सवाल (fcntl) के रूप में जुड़ा हुआ करता यह नहीं कह रहा कि fcntl इंटर थ्रेड लॉकिंग के लिए उपयुक्त नहीं है। यह कह रहा है कि fcntl fds के बारे में परवाह करता है। इसलिए जब तक आप लॉकिंग फ़ाइल खोलते हैं और प्रत्येक लॉक इंस्टेंस के लिए नया एफडी प्राप्त करते हैं, तब तक आप इंटर-प्रोसेस और इंटर-थ्रेड लॉकिंग के लिए fcntl का उपयोग कर सकते हैं।

आप अंतर-थ्रेड लॉकिंग के लिए इंटर-प्रोसेस और पायथन के सेमफोर के लिए fcntl के संयोजन का भी उपयोग कर सकते हैं।

और आखिरकार: अपने आर्किटेक्चर पर पुनर्विचार करें। लॉकिंग आम तौर पर खराब है। एक प्रक्रिया के लिए संसाधन का प्रतिनिधि जो लॉकिंग के बिना इसका ख्याल रखेगा। इसे बनाए रखने के लिए यह और अधिक आसान होगा। मुझ पर विश्वास करो।

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

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