2

ループ内にいくつかの LoopingCall タスクが定義されている場合、ツイストはコールバックを混乱させ、最後に定義されたタスクを常に実行します

サンプルコード:

from twisted.internet import reactor, task
from pprint import pprint

for s in [1,2]:
  task.LoopingCall(lambda: pprint(s)).start(1)

reactor.run()

応答:1 2 2 2 2 2

動作するループのないコード:

from twisted.internet import reactor, task
from pprint import pprint

task.LoopingCall(lambda: pprint(1)).start(1)
task.LoopingCall(lambda: pprint(2)).start(1)

reactor.run()

正しい応答:1 2 1 2 1 2

4

1 に答える 1

2

これは、Python でのスコープの動作の結果です。

Twisted のことはしばらく忘れて、次の例を考えてみてください。

x = 1
f1 = lambda: x
x = 2
f2 = lambda: x
print f1()
print f2()

結果は次のようになります。

1
2

ただし、代わりに、次のようになります。

2
2

f1と関数はf2両方とも同じ変数を「閉じます」: x. 変数は、一度に 1 つのオブジェクトしか参照できず、 の後x = 2に -not を参照し2ます1

于 2013-04-29T17:51:03.773 に答える