为什么这个python高速公路示例代码使用yield sleep(1)
而不仅仅是sleep(1)
?
class Component(ApplicationSession):
"""
An application component that publishes an event every second.
"""
@inlineCallbacks
def onJoin(self, details):
print("session attached")
counter = 0
while True:
print(".")
self.publish('com.myapp.topic1', counter)
counter += 1
yield sleep(1)
if __name__ == '__main__':
from autobahn.twisted.wamp import ApplicationRunner
runner = ApplicationRunner("ws://127.0.0.1:8080/ws", "realm1")
runner.run(Component)
答案 0 :(得分:2)
因为Python的标准库sleep
将阻止Twisted反应器,而Autobahn的sleep
Twisted助手将返回Twisted Deferred(并且不阻止反应堆):{ {3}}
答案 1 :(得分:0)
使用yield sleep(1)
可以返回结果并执行其他操作。
但仅使用sleep(1)
会导致main
始终在函数onJoin
中。
这是一个无死的循环。
点击here
yield表达式仅在定义生成器函数时使用,并且只能在函数定义的主体中使用。在函数定义中使用yield表达式足以使该定义创建生成器函数而不是正常函数。
当调用生成器函数时,它返回一个称为生成器的迭代器。然后该生成器控制生成器函数的执行。当调用其中一个生成器的方法时,执行开始。那时,执行进入第一个yield表达式,再次暂停,将expression_list的值返回给生成器的调用者。通过挂起,我们意味着保留所有本地状态,包括局部变量的当前绑定,指令指针和内部评估堆栈。当通过调用生成器的一个方法恢复执行时,该函数可以完全像yield表达式只是另一个外部调用一样。恢复后yield表达式的值取决于恢复执行的方法。
所有这些使得生成器功能与协同程序非常相似;它们产生多次,它们有多个入口点并且它们的执行可以被暂停。唯一的区别是生成器函数无法控制执行后执行继续的位置;控件总是传送给发生器的调用者。