Twisted Deferred.addCallBack()vs. yield和@inlineDeferred

Nor*_*sUp 10 python twisted

有没有理由使用一个而不是另一个?

他们有相同的表现吗?

rlo*_*tun 16

例如,我倾向于将inlineCallbacks多步骤初始化(例如auth)用于某些服务,其中每个后续步骤取决于前一步骤的结果.除了这些情况,我倾向于发现inlineCallbacks可能导致懒惰的编程,可能会减慢您的应用程序.

这是一个例子:

@defer.inlineCallbacks
def some_func():
    res1 = yield call1()
    res2 = yield call2()
    ... do something with res1 and res2 ...
Run Code Online (Sandbox Code Playgroud)

如果call1并且call2是要并行化的完全独立的调用,则此函数将最终序列化这些调用.要将此转换为并行调用,您应该:

@defer.inlineCallbacks
def some_func_better():
    d1 = call1()
    d2 = call2()
    res1 = yield d1
    res2 = yield d2
Run Code Online (Sandbox Code Playgroud)

通过这种方式,你可以同时运行call1和call2,但是当它们进入时你会等待结果.因此,尽管可以获得与缺货相同的优势,但似乎inlineCallbacks只是让实现前一个解决方案变得太容易了.

另外,请记住,您仍然必须try...except围绕所有yield调用包装块,因为它们是在代码中捕获错误的唯一方法(除非函数的调用inlineCallbacks函数处理该级别的errback).

因此,我发现它本身并不是一个性能问题,而是inlineCallbacks 一般会让我反对的良好习惯- 它们仍然适用于快速代码片段,多阶段初始化例程或测试.