Twisted 中的矩屈服(来自 Tornado)相当于什么?
What's the equivalent of moment-yielding (from Tornado) in Twisted?
部分 inlineCallbacks
的实现是这样的:
if isinstance(result, Deferred):
# a deferred was yielded, get the result.
def gotResult(r):
if waiting[0]:
waiting[0] = False
waiting[1] = r
else:
_inlineCallbacks(r, g, deferred)
result.addBoth(gotResult)
if waiting[0]:
# Haven't called back yet, set flag so that we get reinvoked
# and return from the loop
waiting[0] = False
return deferred
result = waiting[1]
# Reset waiting to initial values for next loop. gotResult uses
# waiting, but this isn't a problem because gotResult is only
# executed once, and if it hasn't been executed yet, the return
# branch above would have been taken.
waiting[0] = True
waiting[1] = None
如图所示,如果在 inlineCallbacks
装饰函数中,我会这样调用:
@inlineCallbacks
def myfunction(a, b):
c = callsomething(a)
yield twisted.internet.defer.succeed(None)
print callsomething2(b, c)
这个 yield 将立即返回到函数(这意味着:它不会被重新安排,而是立即从 yield 继续)。这与 Tornado 的 tornado.gen.moment
形成对比(它不过是一个已经解决的 Future
,结果是 None
),这使得 yielder 重新安排自己,不管未来已经解决与否。
当产生像 moment
这样的虚拟未来时,我如何才能运行像 Tornado 那样的行为?
等价物可能类似于生成 Deferred
,直到 "soon" 才会触发。 reactor.callLater(0, ...)
被普遍接受来创建一个现在不 运行 但很快就会 运行 的定时事件。您可以使用 twisted.internet.task.deferLater(reactor, 0, lambda: None)
.
轻松获得基于此触发的 Deferred
尽管如此(在 Twisted 和 Tornado 中),您可能想看看替代的调度工具。这种重新调度技巧通常只适用于小型、简单的应用程序。它的有效性会随着同时使用它的任务的增加而降低。
考虑 twisted.internet.task.cooperate
之类的东西是否可以提供更好的解决方案。
部分 inlineCallbacks
的实现是这样的:
if isinstance(result, Deferred):
# a deferred was yielded, get the result.
def gotResult(r):
if waiting[0]:
waiting[0] = False
waiting[1] = r
else:
_inlineCallbacks(r, g, deferred)
result.addBoth(gotResult)
if waiting[0]:
# Haven't called back yet, set flag so that we get reinvoked
# and return from the loop
waiting[0] = False
return deferred
result = waiting[1]
# Reset waiting to initial values for next loop. gotResult uses
# waiting, but this isn't a problem because gotResult is only
# executed once, and if it hasn't been executed yet, the return
# branch above would have been taken.
waiting[0] = True
waiting[1] = None
如图所示,如果在 inlineCallbacks
装饰函数中,我会这样调用:
@inlineCallbacks
def myfunction(a, b):
c = callsomething(a)
yield twisted.internet.defer.succeed(None)
print callsomething2(b, c)
这个 yield 将立即返回到函数(这意味着:它不会被重新安排,而是立即从 yield 继续)。这与 Tornado 的 tornado.gen.moment
形成对比(它不过是一个已经解决的 Future
,结果是 None
),这使得 yielder 重新安排自己,不管未来已经解决与否。
当产生像 moment
这样的虚拟未来时,我如何才能运行像 Tornado 那样的行为?
等价物可能类似于生成 Deferred
,直到 "soon" 才会触发。 reactor.callLater(0, ...)
被普遍接受来创建一个现在不 运行 但很快就会 运行 的定时事件。您可以使用 twisted.internet.task.deferLater(reactor, 0, lambda: None)
.
Deferred
尽管如此(在 Twisted 和 Tornado 中),您可能想看看替代的调度工具。这种重新调度技巧通常只适用于小型、简单的应用程序。它的有效性会随着同时使用它的任务的增加而降低。
考虑 twisted.internet.task.cooperate
之类的东西是否可以提供更好的解决方案。