为什么python高速公路代码需要使用';收益率';关键词?
为什么这个python高速公路示例代码使用为什么python高速公路代码需要使用';收益率';关键词?,python,python-2.7,twisted,autobahn,Python,Python 2.7,Twisted,Autobahn,为什么这个python高速公路示例代码使用产生睡眠(1),而不是简单地使用睡眠(1) 使用yield sleep(1)可以返回结果并执行其他操作 但只使用sleep(1)将导致main始终处于函数onJoin。 这是一个无死角的循环 点击 屈服表达式仅在定义生成器函数时使用,并且只能在函数定义的主体中使用。在函数定义中使用屈服表达式足以使该定义创建生成器函数而不是普通函数 调用生成器函数时,它返回一个称为生成器的迭代器。然后,该生成器控制生成器功能的执行。当调用生成器的一个方法时,执行开始。此时
产生睡眠(1)
,而不是简单地使用睡眠(1)
使用yield sleep(1)
可以返回结果并执行其他操作
但只使用sleep(1)
将导致main
始终处于函数onJoin
。
这是一个无死角的循环
点击
屈服表达式仅在定义生成器函数时使用,并且只能在函数定义的主体中使用。在函数定义中使用屈服表达式足以使该定义创建生成器函数而不是普通函数
调用生成器函数时,它返回一个称为生成器的迭代器。然后,该生成器控制生成器功能的执行。当调用生成器的一个方法时,执行开始。此时,执行继续到第一个yield表达式,在那里它再次被挂起,并将expression_list的值返回给生成器的调用者。挂起意味着保留所有局部状态,包括局部变量的当前绑定、指令指针和内部计算堆栈。当通过调用生成器的一个方法来恢复执行时,函数可以完全按照yield表达式只是另一个外部调用的方式进行。恢复后产量表达式的值取决于恢复执行的方法
所有这些使得生成器的功能非常类似于协同程序;它们多次屈服,有多个入口点,可以暂停执行。唯一的区别是,生成器函数无法控制在其产生后执行应在何处继续;控制权始终转移到生成器的调用方
因为Python的标准库
sleep
将阻止Twisted reactor,而Autobahn的sleep
helper for Twisted将返回Twisted Deferred(而不是阻止reactor):谢谢。但是为什么不返回睡眠(1)
?返回睡眠(1)
在循环时终止。谢谢。我想你得到了正确的答案。改变了我对答案的选择。但这很可怕。我怎么知道我的其他python代码不会阻止Twister呢?您必须知道python标准库的哪些部分在幕后阻止系统调用。基本上,stdlib中与网络相关的所有内容都是阻塞的。
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)