【问题标题】:What's the equivalent of moment-yielding (from Tornado) in Twisted?Twisted 中的瞬间屈服(来自 Tornado)的等价物是什么?
【发布时间】:2015-01-05 22:51:41
【问题描述】:

部分实现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-decorated 函数中,我会这样调用:

@inlineCallbacks
def myfunction(a, b):
    c = callsomething(a)
    yield twisted.internet.defer.succeed(None)
    print callsomething2(b, c)

这个产量将立即返回到函数中(这意味着:它不会被重新安排,而是立即从产量继续)。这与 Tornado 的 tornado.gen.moment 形成对比(这不过是一个已经解决的 FutureNone 的结果),这使得 yielder 重新安排自己,无论未来是否已经解决。

当产生像moment 这样的虚拟未来时,我如何运行像 Tornado 那样的行为?

【问题讨论】:

    标签: twisted tornado


    【解决方案1】:

    等价物可能类似于产生 Deferred 直到“很快”才会触发。 reactor.callLater(0, ...) 通常被接受来创建一个现在不运行但很快就会运行的定时事件。您可以使用twisted.internet.task.deferLater(reactor, 0, lambda: None) 轻松获得基于此触发的Deferred

    不过,您可能希望查看替代调度工具(在 Twisted 和 Tornado 中)。这种重新调度技巧通常只适用于小型、简单的应用程序。它的有效性会降低同时使用它的更多任务。

    考虑像twisted.internet.task.cooperate 这样的东西是否可以提供更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2013-06-16
      • 2014-06-12
      • 1970-01-01
      • 2022-11-28
      • 2016-11-25
      • 1970-01-01
      相关资源
      最近更新 更多