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 之类的东西是否可以提供更好的解决方案。