如何设置LoopingCall 调度的函数的调用次数?

How to set number of calls of the function scheduled by LoopingCall?

这是代码的框架:

from twisted.internet import reactor
from twisted.internet.task import LoopingCall

def do_something():
    print "Doing something..."

def process_result():
    print "Processing result..."

def loop():
    LoopingCall(do_something).start(1)

reactor.callWhenRunning(loop)
reactor.run()

在我的代码中,我想要 运行 do_something 100 次,之后我将调用 process_result 来执行其名称指示的操作。

在文档中我找到了 withCount,但是我对“自上次调用后应该发生的事情感到困惑”和“其中的计数通常为 1"。 (使用LoopingCall调用一次函数?有什么意义?我想我误解了它但正确的解释是什么?)

我想知道:withCount 是否正确使用?如果是,谁能举个具体的例子?

withCount 在 LoopingCall 错过迭代时为您提供有用的信息。例如,如果间隔为 1,但该函数需要 5 秒,则该函数应该被调用的次数为 5。但是,在您的示例中,函数 returns 几乎立即(并且不是延迟)所以它总是 1.

from twisted.internet import reactor
from twisted.internet.task import LoopingCall

def do_something(count):
    print "Doing something..." + str(count)

def process_result():
    print "Processing result..."

def loop():
    LoopingCall.withCount(do_something).start(1)

reactor.callWhenRunning(loop)
reactor.run()

您需要检查函数被调用的次数,当达到指定次数时使用lc.stop。如果你不想在do_something中引入额外的逻辑,你可以做一个包装器class.

from twisted.internet import reactor
from twisted.internet.task import LoopingCall

def do_something():
    print "Doing something..."

def process_result():
    print "Processing result..."

def loop():
    LoopingCallWithCounter(5, do_something).lc.start(1)

class LoopingCallWithCounter:
    def __init__(self, count, f, *a, **kw):
        self.i = 0
        def wrapper():
            if self.i >= count:
                self.lc.stop()
            else:
                f(*a, **kw)
                self.i += 1
        self.lc = LoopingCall(wrapper)

reactor.callWhenRunning(loop)
reactor.run()

最后,由于 lc.start returns 在调用 lc.stop 时延迟,您可以简单地使用 addCallback(process_result) 进行 post 处理。请注意 process_result 应该有一个参数。