2013-04-22 5 views
7

मैं दो उपयोग के मामलों के साथ अजगर में एक साधारण प्रहरी टाइमर लागू करने के लिए करना चाहते हैं:पायथन में वॉचडॉग टाइमर को कैसे कार्यान्वित करें?

  • निगरानी सुनिश्चित करता है कि एक समारोह से अधिक समय x सेकंड निष्पादित नहीं करता है
  • निगरानी सुनिश्चित करता है कि कुछ नियमित रूप से निष्पादित समारोह वास्तव में अमल करता है कम से कम प्रत्येक y सेकंड

मैं यह कैसे कर सकता हूं?

+0

यहाँ जो केवल एक धागा बनाता है] (https://stackoverflow.com/a/34115590/4279) – jfs

उत्तर

6

बस इस के लिए अपने खुद के समाधान का प्रकाशन:

watchdog = Watchdog(x) 
try: 
    # do something that might take too long 
except Watchdog: 
    # handle watchdog error 
watchdog.stop() 

प्रयोग करता है, तो आप नियमित रूप से कुछ पर अमल और करना चाहते हैं:

from threading import Timer 

class Watchdog: 
    def __init__(self, timeout, userHandler=None): # timeout in seconds 
     self.timeout = timeout 
     self.handler = userHandler if userHandler is not None else self.defaultHandler 
     self.timer = Timer(self.timeout, self.handler) 
     self.timer.start() 

    def reset(self): 
     self.timer.cancel() 
     self.timer = Timer(self.timeout, self.handler) 
     self.timer.start() 

    def stop(self): 
     self.timer.cancel() 

    def defaultHandler(self): 
     raise self 

प्रयोग क्या आप वाकई समारोह कम से कम x सेकंड में खत्म करना चाहते हैं सुनिश्चित करें कि इसे कम से कम प्रत्येक y सेकंड निष्पादित किया गया है:

import sys 

def myHandler(): 
    print "Whoa! Watchdog expired. Holy heavens!" 
    sys.exit() 

watchdog = Watchdog(y, myHandler) 

def doSomethingRegularly(): 
    # make sure you do not return in here or call watchdog.reset() before returning 
    watchdog.reset() 
+0

कभी पीईपी 8 के बारे में सुना? और यहां 'टाइमर()' क्या है? –

+0

नहीं, इसके बारे में नहीं सुना है। मैं शुरुआत कर रहा हूँ लेकिन एक बार जब मैं इसके लिए अधिक समय लेता हूं तो मैं जांच करूंगा ... –

+1

मुझे आपकी 'रीसेट' विधि के बारे में निश्चित नहीं है। आपके '__init__' में' 'उपयोगकर्ता हैंडलर '(जो कि' कोई नहीं 'बीटीडब्लू नहीं होना चाहिए) के आधार पर आपके' टाइमर 'स्विच की आपूर्ति की जाती है, इस मामले में इसका उपयोग किया जाता है। 'रीसेट' में - यह हमेशा 'self.handler' होता है जिसका उपयोग तब किया जाएगा ... –

1

खैर मुझे किसी धागे को बाधित करने का कोई तरीका नहीं मिला है, जिसे मैं 'वॉचडॉग टाइमर' चाहता था, और यह उदाहरण मेरे लिए भी काम नहीं करता है। जब मैं चलाने

import time 
if __name__ == '__main__': 
    Watchdog(1) 
    try: 
     while True: 
      print 'Tiempo' 
      time.sleep(0.1) 
    except Watchdog: 
     print 'Error' 

खैर कुछ भी नहीं होता ... मैं बिना किसी हस्तक्षेप मिलता है।

मैंने लाइन 'self.timer.start()' जोड़ा, मुझे एक अपवाद उठाया गया, लेकिन मेरे मुख्य धागे को बाधित नहीं करता है। पंक्ति "प्रिंट" त्रुटि "कभी निष्पादित नहीं होती है जब तक कि मैं Ctrl + C दबाता हूं।

1

signal.alarm() अपने कार्यक्रम के लिए समय समाप्त करता है और आप अपने मुख्य पाश में यह कॉल कर सकते हैं, और अधिक से अधिक करने के लिए यह सेट दो बार आप को सहन करने के लिए तैयार हैं: [ `WatchdogTimer` कार्यान्वयन

import signal 
while True: 
    signal.alarm(10) 
    infloop() 
+0

मुझे लगता है कि यह केवल यूनिक्स पर काम करता है – andy

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