2013-01-18 22 views
6

संभव डुप्लिकेट:
Python: single instance of programरोकें एक अजगर स्क्रिप्ट के समवर्ती उदाहरणों चल

मैं समवर्ती उदाहरणों चल एक काम समय लेता है जब लांचर से पूरा करने के लिए से एक क्रॉन जॉब को रोकने के लिए की जरूरत है मध्यान्तर। मैं इसे प्राप्त करने के लिए झुंड अवधारणा का उपयोग करने की कोशिश कर रहा हूं, लेकिन fcntl मॉड्यूल जिस तरह से मैं अपेक्षा करता हूं उससे व्यवहार नहीं कर रहा हूं।

किसी को भी मुझे बता सकते हैं क्यों यह दो समवर्ती उदाहरणों को रोकने के लिए काम करता है: क्यों यह काम नहीं करता

import sys 
import time 
import fcntl 

file_path = '/var/lock/test.py' 
file_handle = open(file_path, 'w') 

try: 
    fcntl.lockf(file_handle, fcntl.LOCK_EX | fcntl.LOCK_NB) 
    print 'no other instance is running' 
    for i in range(5): 
     time.sleep(1) 
     print i + 1 

except IOError: 
    print 'another instance is running exiting now' 
    sys.exit(0) 

और:

import sys 
import time 
import fcntl 

def file_is_locked(file_path): 
    file_handle = open(file_path, 'w') 
    try: 
     fcntl.lockf(file_handle, fcntl.LOCK_EX | fcntl.LOCK_NB) 
     return False 
    except IOError: 
     return True 

file_path = '/var/lock/test.py' 

if file_is_locked(file_path): 
    print 'another instance is running exiting now' 
    sys.exit(0) 
else: 
    print 'no other instance is running' 
    for i in range(5): 
     time.sleep(1) 
     print i + 1 
+1

http://stackoverflow.com/questions/380870/python-single-instance-of-program के संभावित dup। जो सभी कष्टप्रद क्रॉस-प्लेटफॉर्म मुद्दों से निपटने के लिए [tendo] (http://pypi.python.org/pypi/tendo) नामक लाइब्रेरी का भी विस्तार करता है। बेशक यह जवाब नहीं देता है "एक काम क्यों करता है लेकिन बी नहीं?" सवाल है, लेकिन यह अंतर्निहित प्रश्न हल करता है "मुझे यह कैसे करना चाहिए?" – abarnert

उत्तर

6

मेरी विनम्र राय (हालांकि मैं पूरी तरह गलत हो सकता हूं) यह है कि file_handle फ़ंक्शन के लिए स्थानीय है (दूसरे मामले में) और इसलिए, कार्य पूरा होने के बाद यह नष्ट हो जाता है।

निम्नलिखित कोड अपेक्षा के अनुरूप काम करने लगता है:

#!/usr/bin/env python 
#http://stackoverflow.com/questions/14406562/prevent-running-concurrent-instances-of-a-python-script 

import sys 
import time 
import fcntl 

file_handle = None 

def file_is_locked(file_path): 
    global file_handle 
    file_handle= open(file_path, 'w') 
    try: 
     fcntl.lockf(file_handle, fcntl.LOCK_EX | fcntl.LOCK_NB) 
     return False 
    except IOError: 
     return True 

file_path = '/var/lock/test.py' 

if file_is_locked(file_path): 
    print 'another instance is running exiting now' 
    sys.exit(0) 
else: 
    print 'no other instance is running' 
    for i in range(5): 
     time.sleep(1) 
     print i + 1 

सूचना है कि केवल एक चीज मैंने किया था वैश्विक चर के रूप में file_handle स्थापित कर रही है

+0

अच्छा पकड़ो। तो समस्या यह है कि पहले उदाहरण से पहले संभाल को कचरा इकट्ठा किया जाता है, इस प्रकार लॉक जारी किया जाता है, भले ही यह अभी तक पूरा नहीं हुआ हो। इसका उपयोग करने और इसके लिए ऑब्जेक्ट करने का एक अच्छा कारण लगता है। फिर आप एक ही कोड का उपयोग कर चीजों को किसी भी लूप, धागे या प्रक्रियाओं में समवर्ती रूप से चलने से रोकने के लिए उपयोग कर सकते हैं। फिर फिर, आप बस कोशिश कर सकते हैं http://stackoverflow.com/questions/2798727/named-semaphores-in-python –

-1

सबसे आसान तरीका एक फ़ाइल/tmp/scriptlock बनाने के लिए किया जाएगा स्क्रिप्ट की शुरुआत में और जांच करें कि काम करने से पहले यह फ़ाइल मौजूद है या नहीं। सुनिश्चित करें कि प्रसंस्करण के अंत में लॉक फ़ाइल हटा दी गई है।

+0

यदि आप ऐसा करते हैं तो सुनिश्चित करें कि आप रेस स्थितियों से बचने के लिए पाइथन के टेम्पफाइल मॉड्यूल का उपयोग करें – limscoder

+1

यह ओपी क्या कर रहा है, वही है, और सवाल यह है कि, "ये अलग क्यों हैं?" नहीं, "मैं यह कैसे कर सकता हूं?" –

+0

मैं रेस स्थितियों से बचने के अन्य तरीकों के लिए खुला हूं भले ही वे fcntl का उपयोग न करें। – tponthieux

0

(हालांकि मैं एक काम उदाहरण के लिए पूरे कोड की नकल की) जैसा कि मैंने @ बोराजाएक्स के उत्तर पर मेरे कमेन में उल्लेख किया है, क्योंकि ऐसा लगता है कि आप पॉज़िक्स-बाध्य हैं, फिर भी आप native named semaphore का उपयोग करने का प्रयास कर सकते हैं।

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

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