これは Deferred には適していません。代わりに、次を使用してみてくださいreactor.callLater
。
from twisted.internet import reactor
def loopPrinting():
print chr(random.randint(97, 122))
reactor.callLater(1.0, loopPrinting)
loopPrinting()
reactor.run()
またはtwisted.internet.task.LoopingCall
:
from twisted.internet import task, reactor
def loopPrinting():
print chr(random.randint(97, 122))
loop = task.LoopingCall(loopPrinting)
loop.start(1.0)
reactor.run()
Deferred ベースのバージョンにはいくつかの問題があります。まず、同じ Deferredを返す Deferred のコールバックを定義します。a
別の Deferred ( と呼びましょう) のコールバックからDeferred ( と呼びましょう) を返すと、 b
「連鎖」と呼ばれる処理が行われます。b
結果が得られるまでコールバック チェーンを一時停止しますa
。a
とb
が実際には同じ Deferred インスタンスである場合、これはほとんどまたはまったく意味がありません。
第二に、すでに結果を持っている Deferred にコールバックを追加すると、コールバックがすぐに呼び出されます。あなたの場合、コールバックは別のコールバックを追加します。そして、そのコールバックは別のコールバックを追加します。したがって、すべてがd.addCallback(loopPrinting)
ライン内に含まれる無限ループがあります。これにより、リアクターが実行されなくなり、プログラムの他の部分が壊れます。