gpt4 book ai didi

twisted - 使用 deferred 进行无限调用循环

转载 作者:行者123 更新时间:2023-12-01 11:59:06 26 4
gpt4 key购买 nike

我们可以使用 deferred ( http://twistedmatrix.com/documents/current/core/howto/defer.html ) 来创建一个无限调用循环,其中函数将自身添加到延迟链中吗?我尝试这样做,但它不起作用:

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()

最佳答案

这不是 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 上定义回调。从另一个 Deferred(我们称它为 b)的回调返回一个 Deferred(我们称它为 a)会执行称为“链接”的操作。它使 b 暂停其回调链,直到 a 有结果。在 ab 实际上是同一个 Deferred 实例的情况下,这几乎没有意义。

其次,当给一个已经有结果的Deferred添加回调时,回调会被立即调用。在您的情况下,您的回调添加了另一个回调。该回调添加了另一个回调。所以你有一个无限循环,全部包含在你的 d.addCallback(loopPrinting) 行中。这将阻止 react 器运行,从而破坏程序的任何其他部分。

关于twisted - 使用 deferred 进行无限调用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com