9

मेरे पास एक नेटवर्क ड्राइव (Z: \) है जो एकाधिक विंडोज कंप्यूटरों द्वारा साझा की जाती है। क्या इस नेटवर्क ड्राइव पर फ़ाइलों को बनाने/हटाने से क्रॉस-मशीन लॉक को कार्यान्वित करना संभव है?फ़ाइलों का उपयोग कर वितरित लॉक को कार्यान्वित करना

उदाहरण के लिए, दो कंप्यूटर, ए और बी, एक ही समय में 123 की आईडी के साथ एक साझा संसाधन को लिखना चाहते हैं।

कंप्यूटरों में से एक, ए कहें, एक खाली फ़ाइल जेड: \ locks \ 123 बनाकर संसाधन को पहले लॉक करता है। जब बी देखता है कि "123" के नाम से लॉक फ़ाइल है, बी जानता है कि संसाधन 123 किसी अन्य व्यक्ति द्वारा उपयोग किया जा रहा है, इसलिए इसे ज़ेड के लिए इंतजार करना होगा: \ locks \ 123 को ए से हटाए जाने से पहले संसाधन।

यह मल्टीथ्रेडिंग में महत्वपूर्ण अनुभाग की तरह है, लेकिन मैं इसे कई मशीनों पर करना चाहता हूं।

मैं पायथन में लागू करने की कोशिश कर रहा हूं।

import os 
import time 


def lock_it(lock_id): 

    lock_path = "Z:\\locks\\" + lock_id 
    while os.path.exists(lock_path): 
     time.sleep(5) # wait for 5 seconds 

    # create the lock file 
    lock_file = open(lock_path, "w") 
    lock_file.close() 


def unlock_it(lock_id): 

    # delete the lock file 
    lock_path = "Z:\\locks\\" + lock_id 
    if os.path.exists(lock_path): 
     os.remove(lock_path) 

यह काम नहीं करेगा एक से अधिक प्रक्रियाओं इंतजार कर स्थिति से बाहर निकलें और एक ही समय में ताला फ़ाइल बनाने के हो सकता है क्योंकि: यहाँ है कि मैं क्या के साथ आया है।

तो फिर, प्रश्न है: क्या साझा स्टोरेज पर क्रॉस-मशीन लॉकिंग तंत्र को कार्यान्वित करना संभव है?

उत्तर

5

... प्रकार।

सबसे पहले, आपको लॉक फ़ाइल के बजाय लॉक निर्देशिका बनाना चाहिए। एक निर्देशिका (os.mkdir देखें) बनाया जा रहा है, ताकि आप इस तरह ताला प्राप्त कर सकते हैं अगर निर्देशिका पहले से मौजूद असफल हो जायेगी,:

while True: 
    try: 
     os.mkdir(r"z:\my_lock") 
     return 
    except OSError as e: 
     if e.errno != 21: # Double check that errno will be the same on Windows 
      raise 
     time.sleep(5) 

दूसरा (और यह वह जगह है जहाँ "की तरह" में आता है) आप कुछ चाहता हूँ लॉक रखने वाले व्यक्ति की मृत्यु हो जाने पर ध्यान देने का तरीका। ऐसा करने का एक आसान तरीका यह है कि उन्हें कभी-कभी लॉक निर्देशिका के अंदर एक फ़ाइल को अद्यतन करना होगा। फिर यदि ग्राहक नोटिस करते हैं कि फ़ाइल थोड़ी देर में अपडेट नहीं की गई है, तो वे निर्देशिका को हटा सकते हैं और लॉक प्राप्त करने का प्रयास कर सकते हैं।

+1

टाइमआउट जोड़ने के बारे में कैसे? यानी, समय के बाद, 60 सेकंड कहें, लॉक स्वचालित रूप से रिलीज़ हो जाता है। यह मानते हुए कि लॉकिंग समय इस टाइमआउट से अधिक नहीं होगा। मैं समय के साथ लॉक टाइम प्राप्त कर सकता हूं। समय() - os.path.getctime ("Z: \ my_lock") यह जांचने के लिए कि क्या लॉक अतिदेय है या नहीं। – eliang

2

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

मेरा सुझाव है कि आप ZooKeeper जैसे कुछ देखें। आप नेटवर्क विफलताओं की स्थिति में सिंक्रोनस ताले बनाने और पुनर्प्राप्त करने में सक्षम होंगे। वितरित ताले के पीछे ढांचा नेटवर्क ड्राइव पर एक फाइल बनाने के बाद और अधिक जटिल है।

+0

मैं मेमचेचे या कतार सॉफ्टवेयर जैसे बीनस्टॉक सोच रहा था। – aitchnyu