工作单位由外部事件驱动。如何确保一个单元只在前一个单元结束后启动?

时间:2013-05-20 05:30:08

标签: python twisted python-2.6

我不确定如何重构我的应用。我已经阅读了有关ChainedDefered的内容,但我对如何将该技术应用于我的情况感到很遗憾。欢迎任何指针/建议。

我正在使用第三方库来监控一些实时变化非常快速的外部数据源。每当检测到更改时,库将在我的代码中调用回调函数。我的回调函数将依次从数据库中检索数据并执行一些处理。

class MyApp(object):
    def start(self):
        for i in range(1, 1000):
            mycallback = CallBackHandler(x, y, z)
            thirdPartyLib.subscribe(event_name + str(i), mycallback)

     reactor.start()


class CallBackHandler(object):
    def __init__(self, x, y, z):
         ....

    def getSomeDataAndDoSomething(self):
        ...

    def __call__(self)
       callLater(self.getSomeDataAndDoSomething)

问题在于,当事件在非常短的时间间隔内快速发生时,可以连续多次调用CallBackHandler。如果这些回调或多或少同时执行,它们将产生相同的结果。

如果最后一个回调已完成处理,如何触发回调?我更喜欢使用twisted提供的构造来实现它,而不是通过比较事件的时间戳(如果它在1秒之前被触发则抛出回调)或全局变量作为标志来实现它。

1 个答案:

答案 0 :(得分:1)

将来请include complete code samples

如果你想执行一些Deferred - 以有限的并发性返回,Twisted包含一个你可以使用的DeferredSemaphore类。

2006年,Jean-Paul Calderone写了一篇很棒的blog post about how to limit parallelism with it