2010-11-18 3 views
2

Ich habe einen Proxyserver geschrieben, der das Anwendungsframework von twisted verwendet. Im Kern verwendet es einen DHT, um Dinge zu lösen. Der DHT-Client benötigt einige Sekunden, um zu starten. Daher möchte ich sicherstellen, dass der Proxy nur Verbindungen akzeptiert, nachdem der DHT bereit ist.Warten Sie, bis ein verdrehter Dienst gestartet wird, bevor Sie einen weiteren starten

# 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)) 

Wie schalte ich den EntangledDHT in eine Art von Dienst, Verdreht für vor dem Start des CosipProxy Dienst warten will? Gibt es einen Mechanismus in Twisted, der dies für mich tut? Oder muss ich einen Rückruf an dht.ready hinzufügen, der den Rest der Anwendung erstellt? Danke

Antwort

2

Rufen Sie nicht sofort serv.setServiceParent(service.IService(application)) an. Warten Sie stattdessen, um es in Ihrem Rückruf an dht.ready aufzurufen. Dadurch wird es gestartet, wenn der Anwendungsdienst bereits ausgeführt wird.

Auch sieht es nicht wie dht selbst ist ein IService. Es sollte sein; oder besser gesagt, die Sache, die from_config aufruft, sollte ein Dienst sein, da anscheinend from_config einige Verbindungen (zumindest, so sieht es aus, wenn dht.ready wird jemals in diesem Beispiel feuern wird) zu starten. Ihre Plugin- oder Tac-Datei sollte sein, die einen Dienst bildet, nicht , der ein Service beginnt. Nichts sollte passieren, bis der erste startService aufgerufen wird.

+0

Sorry ich habe nicht eine Weile geantwortet, ich hatte keine Zeit um daran zu arbeiten. Wenn ich den 'EntangledDHT' in einen IService umwandle, sollte er sich nur in' startService' mit dem Netzwerk verbinden, nicht wenn der Obhect erstellt wird? Ich nehme an, die Bibliothek, die ich verwende (verschränkt), tut das auch nicht richtig, da die von ihr definierte Protokollklasse auch 'twisted.internet.reactor.listenUDP (..)'? –