2010-11-18 88 views
2

我已經編寫了使用twisted的應用程序框架的代理服務器。在它的核心,它使用DHT來解決問題。 DHT客戶端需要幾秒鐘才能啓動,因此我想確保代理只在DHT準備就緒後接受連接。等待扭曲的服務在啓動之前啓動另一個

# there is a class like 
class EntangledDHT(object): 
    # connects to the dht 

# create the client 
dht = EntangledDHT.from_config(config) 

# when it can be used this deferred fires 
# i want to wait for this before creating the "real" application 
dht.ready 


# the proxy server, it uses the dht client 
port = config.getint(section, 'port') 

p = CosipProxy(host=config.get(section, 'listen'), 
       port=port, 
       dht=dht, 
       domain=config.get(section, 'domain')) 


## for twistd 
application = service.Application('cosip') 

serv = internet.UDPServer(port, p) 
serv.setServiceParent(service.IService(application)) 

如何打開EntangledDHT成某種服務是扭曲將啓動CosipProxy服務之前等待?是否有任何扭曲的機制爲我做到這一點?或者我必須添加一個回調到dht.ready來創建應用程序的其餘部分?謝謝

回答

2

不要立刻打電話serv.setServiceParent(service.IService(application))。相反,請等待您在回撥至dht.ready時調用它。這將導致它在應用程序服務已經運行時啓動。

此外,它看起來不像dht本身是一個IService。它應該是;或者說,from_config應該是一項服務,因爲from_config顯然會啓動一些連接(至少,在這個示例中,如果dht.ready將會觸發,那看起來就是這樣)。你的插件或tac文件應該是構造一個服務,而不是一個服務起始。在調用第一個startService之前什麼都不應該發生。

+0

對不起,我沒有在一段時間內回覆,我沒有時間在這方面的工作。當我把'EntangledDHT'變成IService時,它應該只在'startService'開始連接網絡,而不是在創建obhect時?我想我正在使用的庫(糾結)也沒有這麼做,因爲它定義的協議類也是'twisted.internet.reactor.listenUDP(..)'? – 2010-11-23 15:11:28

相關問題