2015-06-18 13 views
8

मेरे पास दो पायथन स्क्रिप्ट हैं, दोनों को बाहरी कार्यक्रम को कॉल करने के लिए नियमित अंतराल (क्रोनबॉज सोचें) की आवश्यकता होती है।क्या दो पायथन प्रोग्राम एक ही बाइनरी को एक ही समय में निष्पादित करने से रोकने का कोई तरीका है?

यदि यह प्रोग्राम (जिस पर हमारे पास कोई नियंत्रण नहीं है) को दो बार एक साथ बुलाया जाता है, तो डेटा त्रुटियां होती हैं, इसलिए हमें इस बाइनरी में कॉल सिंक्रनाइज़ करने का एक तरीका होना चाहिए।

क्या ऐसा करने का कोई तरीका है, अधिमानतः केवल पायथन मानक लाइब्रेरी का उपयोग करना?

+0

बस एक फ़ाइल आधारित लॉक का उपयोग करें जो प्रत्येक स्क्रिप्ट बाहरी बाइनरी निष्पादित करने से पहले जांचता है। –

+0

यदि प्रोग्राम बाहरी है, तो दोनों स्क्रिप्ट एक साधारण "लॉक" फ़ाइल साझा कर सकती हैं। – Alex

+0

मैं नहीं सोचता * stdlib में उपयोग करने के लिए एक उपयोग समाधान है; लेकिन वहां [लॉकफाइल] है (https://pypi.python.org/pypi/lockfile) –

उत्तर

5

तो एक 3-पक्ष लाइब्रेरी का उपयोग किए बिना इस तरह के filelock के रूप में आप कुछ इस तरह करना होगा:

import os 
from subprocess import check_call 

if os.path.exists("/var/run/foo.ock"): 
    print("Backing off...") 
    raise SystemExit(1) 

try: 
    with open("/var/run/foo.lock", "w"): 
     check_call("/path/to/binary") 
finally: 
    os.remove("/var/run/foo.lock") 

बेहतर दृष्टिकोण filelock उपयोग करने के लिए (आप 3 पार्टी पुस्तकालयों स्थापित कर सकते हैं अगर) है :

from filelock import FileLock 

with FileLock("/path/to/binary"): 
    check_call("/path/to/binary") 

आप आसानी सेpip का उपयोग कर स्थापित कर सकते हैं filelock:

$ pip install filelock 

भी देखें संबंधित: Locking a file in Python

नोट: वहाँ भी एक बहुत इसी तरह नामित पैकेज lockfile कहा जाता प्रतीत हो रहा है! (दो को भ्रमित न करें!)

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