Python3再次穿线定时器/回调.start()?

时间:2018-01-20 03:55:38

标签: multithreading python-3.x timer

让我们说我已经建立了一个小型的自定义类 - 我想很快在下面构建了一个代表性的原型 - 以帮助我保持并操作一些数据。

但最终用例是保留数据并定期删除旧数据,实际上只是保留较新的数据。我想开始我会尝试在15秒后删除所有数据。并且明白,在尝试对我拥有的数据进行操作/操作时,嗯,它确实不到15秒。所以这是所有新数据。

然后我可以让课程更复杂 - 做一些事情 - 不要删除所有数据,只删除非常旧的东西,或者将15秒间隔更改为动态/更智能等等。

但在我接近那一点之前,我被线程/计时器的工作方式弄得一团糟。我根据经验发现,下面的代码只打印出“Fresh”'如果我包含第二个/后续的threading.Timer调用INSIDE freshen_up方法,这是回调。我原本以为我只需要启动计时器一次,它只会每15秒调用一次回调。我是疯了,还是每次都需要设置计时器' (正如我在下面的代码中所做的那样),为了这个简单的实现工作?再说一遍,据我所知,这段代码有效,我很惊讶我每次都需要启动一个新的计时器。所以我想确保我没有做一些效率低下/不必要的事情,因为我对计时器工作原理缺乏了解...谢谢

import threading

class Fresh_Data_Container():

    def __init__(self):

        self.fresh_data_dict = {}
        threading.Timer(15.0, self.freshen_up).start()

    def freshen_up(self):

        self.fresh_data_dict = {} # starting over for now, perhaps more nuanced later 
        print ('Fresh!')

        threading.Timer(15.0, self.freshen_up).start() # does this really have to be here or am i looking at this wrong?

    def add_fresh_data(self, some_key, fresh_data):
        if some_key in self.fresh_data_dict:
            self.fresh_data_dict[some_key].append(fresh_data)
        else:
            self.fresh_data_dict[some_key] = [fresh_data]

    def operate_on_data(self):
        pass # do stuff 

1 个答案:

答案 0 :(得分:2)

//Create workbook Workbook wb = new Workbook(); //Access first worksheet Worksheet ws = wb.Worksheets[0]; //Add hyperlink in cell A1 int idx = ws.Hyperlinks.Add("A1", 1, 1, "https://forum.aspose.com/c/cells"); ws.Hyperlinks[idx].TextToDisplay = "Cells Link No: 11"; //Add hyperlink in cell A2 idx = ws.Hyperlinks.Add("A2", 1, 1, "https://forum.aspose.com/c/total"); ws.Hyperlinks[idx].TextToDisplay = "Total Link No: 16"; //Add hyperlink in cell A3 idx = ws.Hyperlinks.Add("A3", 1, 1, "https://forum.aspose.com/c/words"); ws.Hyperlinks[idx].TextToDisplay = "Words Link No: 29"; //Add hyperlink in cell A4 idx = ws.Hyperlinks.Add("A4", 1, 1, "https://forum.aspose.com/c/pdf"); ws.Hyperlinks[idx].TextToDisplay = "Pdf Link No: 13"; //Add hyperlink in cell A5 idx = ws.Hyperlinks.Add("A5", 1, 1, "https://forum.aspose.com"); ws.Hyperlinks[idx].TextToDisplay = "Forum Link No: 20"; //Add hyperlink in cell A6 idx = ws.Hyperlinks.Add("A6", 1, 1, "https://forum.aspose.com"); ws.Hyperlinks[idx].TextToDisplay = "Forum Link No: 15"; //Autofit columns ws.AutoFitColumns(); //Save the output Excel file wb.Save("output.xlsx"); 不是周期性的 - 也就是说,它只在经过15秒之后调用给定函数,而不是每15秒调用一次。

更好的方法是创建常规threading.Timer而不是Thread

Timer