3

deferred ( http://twistedmatrix.com/documents/current/core/howto/defer.html ) を使用して、関数が deferred チェーンに追加される無限呼び出しループを作成できますか? 私はこれをやろうとしましたが、うまくいきません:

d = deferred.Deferred()
first = True

def loopPrinting(dump):
  ch = chr(random.randint(97, 122))
  print ch
  global d, first
  d.addCallback(loopPrinting)
  if first:
    d.callback('a')
    first = False
  return d

loopPrinting('a')

reactor.run()
4

1 に答える 1

5

これは 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結果が得られるまでコールバック チェーンを一時停止しますaabが実際には同じ Deferred インスタンスである場合、これはほとんどまたはまったく意味がありません。

第二に、すでに結果を持っている Deferred にコールバックを追加すると、コールバックがすぐに呼び出されます。あなたの場合、コールバックは別のコールバックを追加します。そして、そのコールバックは別のコールバックを追加します。したがって、すべてがd.addCallback(loopPrinting)ライン内に含まれる無限ループがあります。これにより、リアクターが実行されなくなり、プログラムの他の部分が壊れます。

于 2010-08-02T21:00:03.650 に答える