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

Python 如何设置LoopingCall调度的函数调用数?,python,twisted,Python,Twisted,以下是代码的框架: 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(

以下是代码的框架:

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()
在我的代码中,我想运行
dou\u something
100次,然后调用
process\u result
来执行其名称所指示的操作

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


我想知道:
withCount
是正确的用法吗?如果是,有人能提供一个具体的例子吗?

withCount
在循环调用错过迭代时为您提供有用的信息。例如,如果间隔为1,但函数需要5秒,则应调用函数的次数为5次。但是,在您的示例中,函数几乎立即返回(并且不是延迟的),因此它始终为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。达到指定次数后停止。如果您不想在
dou\u something
中引入额外的逻辑,可以创建一个包装器类

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
在调用
lc.stop
时返回延迟,因此您只需使用
addCallback(process\u result)
进行后处理。请注意,
process\u result
应包含一个参数。

“withCount仅在您希望调用的函数花费的时间超过间隔时才有用。”