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
一般会让我反对的良好习惯- 它们仍然适用于快速代码片段,多阶段初始化例程或测试.
归档时间: |
|
查看次数: |
4889 次 |
最近记录: |