我编写了一个使用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
转换为Twisted在启动CosipProxy
服务之前等待的某种服务?是否有扭曲的机制为我做这个?或者我是否必须向创建应用程序其余部分的dht.ready
添加回调?感谢
答案 0 :(得分:2)
请勿立即致电serv.setServiceParent(service.IService(application))
。相反,请等待回调到dht.ready
。如果应用程序服务已在运行,这将导致它被启动。
此外,它看起来dht
本身不是IService
。它应该是;或者更确切地说,调用from_config
的东西应该是一个服务,因为显然from_config
将开始一些联系(至少,如果dht.ready
将要发生的话,那就是它的样子在这个例子中射击)。您的插件或tac文件应构建服务,而不是启动服务。在调用第一个startService
之前不会发生任何事情。