Python 当我不';不需要收益率返回值吗?
在刮擦的核心 ExecutionEngine方法启动Python 当我不';不需要收益率返回值吗?,python,scrapy,deferred,Python,Scrapy,Deferred,在刮擦的核心 ExecutionEngine方法启动 @defer.inlineCallbacks def start(self): """Start the execution engine""" assert not self.running, "Engine already running" self.start_time = time() yield self.signals.send_catch_log_deferred(signal=signals.
@defer.inlineCallbacks
def start(self):
"""Start the execution engine"""
assert not self.running, "Engine already running"
self.start_time = time()
yield self.signals.send_catch_log_deferred(signal=signals.engine_started)
self.running = True
self._closewait = defer.Deferred()
yield self._closewait
为什么不直接使用self.signals.send\u catch\u log\u deferred(signal=signals.engine\u start)
但不是收益
为什么不直接使用self.signals.send\u catch\u log\u deferred(signal=signals.engine\u start)
但不是收益
因为send\u catch\u log\u deferred
返回一个deferred
对象。如果要避免出现收益率
,则应使用send\u catch\u log
,但使用send\u catch\u log\u deferred
的目的是允许侦听器返回deferred
对象
使用send\u catch\u log
的信号不能返回延迟的对象,因此它们不允许执行异步操作
编辑:有关inlineCallbacks
的详细介绍,请参见:@defer。inlineCallbacks希望修饰函数是一个生成器函数,在修饰函数中调用生成器函数(甚至返回一个)不会使函数成为生成器函数。调查:
def gen():
yield 1
def func(): return gen
import dis
dis.dis(gen)
2 0 LOAD_CONST 1 (1)
3 YIELD_VALUE
4 POP_TOP
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
dis.dis(func)
1 0 LOAD_GLOBAL 0 (gen)
3 RETURN_VALUE
import inspect
inspect.isgeneratorfunction(gen)
True
inspect.isgeneratorfunction(func)
False
所以满足@defer.inlineCallbacks的唯一方法是从self.signals.send\u catch\u log\u deferred(signal=signals.engine\u started)或从其他地方获得收益延迟