2012-01-26 42 views
0

我有一個用戶界面,它從服務接收異步通知,提示它重新讀取數據庫中的信息。異步通知包含可用於檢索修改記錄的主鍵。在負載下,我可能會每秒收到10或15個通知,但通常會有重複的ID。就像這樣:限制更新頻率/清除更新緩存

{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.766'} 
{u'callback': u'job.modify', u'job-id': 1091, u'timestamp': u'2012-01-26 09:50:04.767'} 
{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.780'} 
{u'callback': u'job.modify', u'job-id': 1091, u'timestamp': u'2012-01-26 09:50:04.808'} 
{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.812'} 
{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.829'} 
{u'callback': u'job.modify', u'job-id': 1088, u'timestamp': u'2012-01-26 09:50:04.831'} 
{u'callback': u'job.modify', u'job-id': 1088, u'timestamp': u'2012-01-26 09:50:04.836'} 
{u'callback': u'job.modify', u'job-id': 1091, u'timestamp': u'2012-01-26 09:50:04.846'} 

在這種情況下跳過一些數據庫讀取似乎是值得的。我正在和一個班級合作,所以我的想法是配置某種刷新間隔。這是我到目前爲止有:

class myClass(): 
    def __init__(self): 
    self.modified = set([]) 
    self.lastrefresh = datetime.datetime.now() 
    self.refreshinterval = datetime.timedelta(milliseconds = 250) 

    def onModify(self, data): 
    self.modified.add(data['job-id']) 
    if datetime.datetime.now() - self.lastrefresh < self.refreshinterval: 
     return 
    self.doModify() 

    def doModify(): 
    ids = list(self.modified) 
    self.lastrefresh = datetime.datetime.now() 
    self.modified.clear() 

其中一期工程(主要是),但攜帶有遺留下來的一些更新的潛力。因爲這些更新是異步收到的,所以我不知道它們會出現多少次或多久。任何待處理的刷新都會在下一次通知中處理,但是如果下一次通知沒有及時到達,那麼id將位於修改後的集合中,比我想要的250ms間隔長得多。任何建議,非常感謝。

回答

1

我想我找到了一種方法來完成這項工作。它需要修改以下類:

class myClass(): 
    def __init__(self): 
    self.modified = set([]) 
    self.lastrefresh = datetime.datetime.now() 
    self.refreshinterval = datetime.timedelta(milliseconds = 250) 

    def onModify(self, data): 
    self.modified.add(data['job-id']) 
    if datetime.datetime.now() - self.lastrefresh < self.refreshinterval: 
     return 
    self.doModify() 

    def doModify(): 
    if not self.modified: 
     return 
    ids = list(self.modified) 
    self.lastrefresh = datetime.datetime.now() 
    self.modified.clear() 
    wx.CallAfter(self.purgeModifies) 

    def purgeModifies(self): 
    wx.CallLater(250, self.doModify) 

感覺有點做作使用wx.CallAfter後立即調用wx.CallLater,但onModify是在後臺線程,這意味着wx.CallLater拋出一個C++斷言錯誤發生。 wx.CallAfter將控制權返回給主線程,允許wx.CallLater工作。這讓我「再一次運行」來處理任何未完成的更新。