2015-02-06 29 views
1

爲什麼這個python高速公路示例代碼使用yield sleep(1)而不是簡單的sleep(1)爲什麼這個python autobahn代碼需要使用'yield'關鍵字?

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

因爲Python的標準庫sleep將阻止扭曲的反應器,而高速公路的sleep幫手扭曲會返回一個扭曲的延遲(而不是阻止反應堆):https://github.com/tavendo/AutobahnPython/blob/master/autobahn/autobahn/twisted/util.py#L29

+0

謝謝。我認爲你得到了正確的答案。改變了我對答案的選擇。但這是可怕的。我怎麼知道我的其他Python代碼不會阻止Twister? – user781486 2015-02-06 12:38:11

+0

你必須知道Python標準庫的哪些部分正在屏蔽系統調用。從本質上講,stdlib中與網絡有關的所有東西都是阻塞的。 – oberstet 2015-02-06 13:52:20

0

使用yield sleep(1)可以返回結果並執行其他操作。

但使用簡單sleep(1)將導致main始終在功能onJoin。 這是一個無止境的循環。

按此here

限定發電機功能時的產量表達僅用於,並且只能在函數定義的體內。在函數定義中使用yield表達式足以導致該定義創建生成器函數,而不是正常函數。

當調用生成器函數時,它將返回一個稱爲生成器的迭代器。該生成器然後控制生成器函數的執行。當一個生成器的方法被調用時執行開始。那時,執行進行到第一個yield表達式,在那裏它再次被掛起,將expression_list的值返回到發生器的調用者。通過暫停,我們的意思是保留所有本地狀態,包括局部變量的當前綁定,指令指針和內部評估堆棧。當通過調用其中一個生成器的方法來恢復執行時,函數可以像yield yield表達式只是另一個外部調用一樣進行。恢復後的yield表達式的值取決於恢復執行的方法。

所有這些使得發電機功能與協同程序非常相似;他們產生多次,他們有不止一個入口點,他們的執行可以被暫停。唯一的區別是生成器函數無法控制執行後應繼續執行的位置;該控件總是被傳送給發生器的調用者。

+0

謝謝。但爲什麼不「睡覺(1)」? – user781486 2015-02-06 07:28:26

+3

'return sleep(1)'終止while循環。 – 2015-02-06 07:32:14

相關問題