做什么@defer.inlineCallbacks意思是当我不需要收益率返回值时?

2024-10-01 15:42:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在废芯发动机在

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.engine_started)
    self.running = True
    self._closewait = defer.Deferred()
    yield self._closewait

为什么不直接使用self.signals.send_catch_log_deferred(signal=signals.engine_started)而不是收益率呢?在


Tags: selfsendlogsignaltimestartrunningdefer
2条回答

Why don't use self.signals.send_catch_log_deferred(signal=signals.engine_started) directly but instead of a yield ?

因为send_catch_log_deferred返回一个Deferred对象。如果您想避免在那里使用yield,那么应该使用send_catch_log,但是使用send_catch_log_deferred的要点是允许侦听器返回Deferred对象。在

使用send_catch_log的信号不能返回Deferred对象,因此它们不允许执行异步操作。在

编辑:有关inlineCallbacks的详细介绍,请参见:http://krondo.com/?p=2441

@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_catch_log_延迟(信号=信号。发动机启动)或者从别的地方。在

相关问题 更多 >

    热门问题