2013-04-22 73 views
7

Tôi muốn thực hiện một bộ đếm thời gian cơ quan giám sát đơn giản bằng Python với hai trường hợp sử dụng:Làm thế nào để thực hiện một bộ đếm thời gian watchdog trong Python?

  • Watchdog đảm bảo rằng một chức năng không thực hiện dài hơn x giây
  • Watchdog đảm bảo rằng một số chức năng thường xuyên thực hiện không thực sự thực hiện ít nhất mỗi y giây

Làm cách nào để làm điều đó?

+0

Dưới đây là [ 'WatchdogTimer' thực hiện chỉ tạo một chuỗi] (https://stackoverflow.com/a/34115590/4279) – jfs

Trả lời

6

Chỉ cần xuất bản giải pháp của riêng tôi thế này:

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 

Cách sử dụng nếu bạn muốn chắc chắn chức năng kết thúc trong vòng chưa đầy x giây:

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

Cách sử dụng nếu bạn thường xuyên thực hiện một cái gì đó và muốn đảm bảo rằng nó được thực hiện ít nhất sau mỗi y giâ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

Bạn đã bao giờ nghe nói về PEP8 chưa? Và 'Timer()' ở đây là gì? –

+0

Không, chưa nghe về nó. Tôi mới bắt đầu. Nhưng tôi sẽ kiểm tra một khi tôi có thêm thời gian cho việc này ... –

+1

Tôi không chắc chắn về phương pháp 'đặt lại' của bạn. Trong '__init__', các công tắc' Timer' của bạn dựa trên 'userHandler' (mà phải là' không phải là None' BTW) được cung cấp, trong trường hợp này nó được sử dụng. Trong 'reset' - luôn luôn' self.handler' sẽ được sử dụng ... –

1

Vâng, tôi đã không tìm thấy một cách để làm gián đoạn một chuỗi mà là những gì tôi muốn 'watchdog timer' cho, và ví dụ này không làm việc cho tôi hoặc. Khi tôi chạy

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

Không có gì xảy ra ... Tôi không bị gián đoạn.

Tôi đã thêm dòng 'self.timer.start()', tôi thấy ngoại lệ được nâng lên nhưng không làm gián đoạn chuỗi chính của mình. Dòng "in" Lỗi "" không bao giờ thực hiện trừ khi tôi nhấn Ctrl + C.

1

signal.alarm() thiết lập một thời gian chờ cho chương trình của bạn, và bạn có thể gọi nó trong vòng lặp chính của bạn, và đặt nó vào càng lớn của hai lần bạn đang chuẩn bị để chịu đựng:

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

Tôi nghĩ rằng điều này chỉ hoạt động trên Unix – andy

Các vấn đề liên quan