如何设置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
应该有一个参数。
这是代码的框架:
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
应该有一个参数。