2012-01-26 47 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工作。这让我“再一次运行”来处理任何未完成的更新。