2017-07-07 10 views
1

は、ここでのコードのスケルトンです:私は100回do_somethingを実行したい私のコードで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() 

、その後、私はその名前が示す何をするprocess_resultを呼び出します。私はwithCountを発見したドキュメントで

は、しかし、私はそれに「カウントは、通常、1ある」「それは最後の呼び出されたために発生している必要があり」について混乱していました。 (LoopingCallを使用して関数を1回呼び出すのはどういう意味ですか?私は誤解していると思われますが、正しい説明は何ですか?)withCount正しいものを使用してください。はいの場合、具体的な例を挙げることはできますか?

答えて

2

withCountは、LoopingCallが反復を逃したときに役立つ情報を提供します。たとえば、インターバルが1であるにもかかわらず関数が5秒かかる場合、関数の呼び出し回数は5回になります。しかし、あなたの例では、関数はほとんど瞬時に戻ります(遅延ではありません)。それは常にあなたは関数が呼び出された回数を確認し、指定回数に達するとlc.stopを使用する必要があります。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() 

なります。 do_somethingに余分なロジックを導入したくない場合は、ラッパークラスを作成できます。 lc.stopが呼び出されたときに延期最後に

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以来戻り、あなたは単に事後処理を行うために addCallback(process_result)を使用することができます。 process_resultには引数が必要です。

+1

"withCountは、呼び出したい機能が間隔よりも長くかかる場合にのみ有効です。" < - そうではありません。 LoopingCallが反復を見逃すことがある他の理由があります。たとえば、プロセスの_other_コードが長時間実行されているとします。 –

+0

それは本当です、ありがとう@ Jean-PaulCalderone、編集しました。 – lamba

関連する問題