为什么这个python高速公路代码需要使用'yield'关键字?

时间:2015-02-06 07:03:15

标签: python python-2.7 twisted autobahn

为什么这个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)

2 个答案:

答案 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表达式的值取决于恢复执行的方法。

     

所有这些使得生成器功能与协同程序非常相似;它们产生多次,它们有多个入口点并且它们的执行可以被暂停。唯一的区别是生成器函数无法控制执行后执行继续的位置;控件总是传送给发生器的调用者。