2011-12-14 106 views
2

我對Pyro4.Daemon對象的requestLoop方法有一些問題。即使在loopCondition爲False之後,requestloop(loopCondition)也不會釋放

我想要的是遠程調用「stop()」方法來釋放requestLoop函數並關閉守護進程。

這個小爲例不起作用

服務器

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from daemon import Pyro4 

class Audit(object): 
    def start_audit(self): 
     with Pyro4.Daemon() as daemon: 
      self_uri = daemon.register(self) 
      ns = Pyro4.locateNS() 
      ns.register("Audit", self_uri) 
      self.running = True 
      print("starting") 
      daemon.requestLoop(loopCondition=self.still_running) 
      print("stopped") 
      self.running = None 

    def hi(self, string): 
     print string 

    def stop(self): 
     self.running = False 

    def still_running(self): 
     return self.running 

def main(): 

    # lancement de l'auditor 
    auditor = Audit() 
    auditor.start_audit() 

if __name__ == "__main__" : 
    main() 

CLIENT

import Pyro4 

def main(): 

    with Pyro4.Proxy("PYRONAME:Audit") as au: 
     au.hi("hello") 
     au.hi("another hi") 
     au.stop() 

我想到的是要看到服務器打印 「你好」 和 「另一個喜」,然後關掉。

但是關閉不會發生,服務器仍然在請求回滾方法中被阻塞。 只要我想要,我可以使用我的代理。

,但如果我創建另一個客戶端,在第一次遠程調用,服務器將關閉,客戶端將引發錯誤:

Pyro4.errors.ConnectionClosedError: receiving: not enough data 

我所有的測試都在說,我需要創建一個第二代理並拋出這個exeption來傳遞requestloop到我的服務器上。

有沒有人有如何清理這個問題的想法?

回答

2

如果你看一下在源examples/callback/client.py你會看到這樣的評論:

# We need to set either a socket communication timeout, 
# or use the select based server. Otherwise the daemon requestLoop 
# will block indefinitely and is never able to evaluate the loopCondition. 
Pyro4.config.COMMTIMEOUT=0.5 

因此,你需要做的是設置在您的服務器文件COMMTIMEOUT,它會根據正常工作我試驗。

注意:您還可以將print語句添加到still_running方法以檢查它何時被調用。如果沒有上面的配置,你會發現它看起來只有在收到新事件時纔會執行該方法,所以在接收到下一個事件後,服務器不會關閉,收到的設置爲runningFalse。例如,如果您執行兩次客戶端程序,服務器將關閉。

+0

它只是工作正常。非常感謝你。 我讀過一些關於TIMEOUT的文檔,說requestloop有3秒的超時時間。也許是舊版本? – ornoone 2011-12-15 09:07:39

相關問題