簡體   English   中英

將狀態保持在不斷運行的python腳本中

[英]Keeping state in a constantly running python script

我有一個python 2.7腳本,它變得非常奇怪。

該腳本不斷運行,在每個循環中它都會檢查一些內容,將它們與上一次運行進行比較並做出一些決定。

我遇到的最大問題是變量,我只有六個變量,由於范圍的原因,我在使用它們方面受到限制。

例如;

import time
import os

LOG_FILE = "/var/log/sc.log"
CHECK_FILE_TMP = "/tmp/myfile"
CHECK_FILE_USR = "/home/snoppy/testfile"
CHECK_FILE_TMP_TIME_INTERVAL = 20
CHECK_FILE_USR_TIME_INTERVAL = 30

def main():
    try:
         last_file_tmp_size = 0
         last_file_usr_size = 0
         last_file_tmp_mtime = 0
         last_file_usr_mtime = 0
         last_file_tmp_check_time = 0
         last_file_usr_check_time = 0
         tmp_file_changed = False
         usr_file_changed = False
         loop_start_time = 0


         print "Starting loop"

         while True:
            loop_start_time = time.time()
            if (time.time() - last_file_tmp_check_time > CHECK_FILE_TMP_TIME_INTERVAL):
                tmp_file_changed = checkFileChanged(CHECK_FILE_TMP, last_file_tmp_size, last_file_tmp_mtime)
                last_file_tmp_size = getFileSize(CHECK_FILE_TMP)
                last_file_tmp_mtime = getFileMTime(CHECK_FILE_TMP)
                if(tmp_file_changed):
                    logChange(CHECK_FILE_TMP, last_file_tmp_size, last_file_tmp_mtime)
                last_file_tmp_check_time = time.time()

            ....
            ....
            sleep(1)
    ...     

這就是我要處理的內容。 我有一些本地變量,我似乎很固執,我必須將它們傳遞給函數-我不想將它們稱為全局變量。

理想情況下....如果我能得到main()函數,例如

try:
   checkFile(CHECK_FILE_TMP)
   checkFile(CHECK_FILE_USR)
   sleep(0.1)
except:
...

因為主體是如此之大! 而且我必須在所有地方傳遞變量...感覺好像主函數是如此so腫!

也許....我可能要去上課嗎?

您需要確定程序的某些部分,這些部分可以從它們的特定詳細信息中抽象出來並重復使用多次。 這是一門藝術,別指望那么容易。 您可以找到許多有關面向對象程序設計的書,這些書解釋了基礎知識並為您提供了一些指導。

這只是一個簡單的例子:

class FileChecker(object):

    def __init__(self, path, interval):
        self.path = path
        self.interval = interval
        self.last_size = None
        self.last_mtime = None
        self.last_check_time = None

    def hasChanged(self):
        ...

    def logChange(self):
        ...

class MultiFileChecker(object):

    DELAY = 1

    def __init__(self):
        self.files = []
        self.loop_start_time = 0

    def addFile(self, f):
        self.files.append(f)

    def loop(self):
        try:
            print "Starting loop"
            while True:
                now = time.time()
                self.loop_start_time = now
                for f in self.files:
                    if now - f.last_check_time > f.interval:
                        if f.hasChanged():
                            f.logChange()
                ...
                sleep(self.DELAY)
            ...

if __name__ == '__main__':
    checker = MultiFileChecker()
    checker.add(FileChecker("/var/log/sc.log", 10))
    checker.add(FileChecker("/tmp/myfile", 20))
    checker.add(FileChecker("/home/snoppy/testfile", 30))
    checker.loop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM