我正在努力学习&了解twisted的工作原理,为此我创建了一个基本的echo服务器,将输入视为键,用于存储在redis上的数据服务器,如果输入与数据库上的键匹配,它将打印出该值,否则打印'key not found'。
我正在避免@defer.inlineCallbacks
只是为了练习更多如何使用Deferreds,代码是:
from twisted.internet import reactor, protocol
from txredis.client import RedisClient
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
class Echo(protocol.Protocol):
def connectionMade(self):
self.factory.count += 1
self.transport.write('There are %d clients\n' % self.factory.count)
def dataReceived(self, data):
clientCreator = protocol.ClientCreator(reactor, RedisClient)
d = clientCreator.connectTCP(REDIS_HOST, REDIS_PORT)
def cb_redis_get(r, data):
d = r.get(data.strip())
def cb_result(x):
if x:
self.transport.write('%s\n' % x)
else:
self.transport.write('key not found\n')
d.addBoth(cb_result)
d.addCallback(cb_redis_get, data)
class EchoFactory(protocol.ServerFactory):
count = 0
protocol = Echo
def main():
reactor.listenTCP(1234, EchoFactory())
reactor.run()
if __name__ == "__main__":
main()
当客户端连接telnet 0 1234
并输入单词时,会建立与redis服务器的连接,使用此方法,如果我有100个并发客户端,则代码将创建100个与redis或memcache服务器的连接。
这可能是预期的行为,但我想知道,如果可以利用扭曲的反应堆,并在启动服务器时,创建一个持久连接并将其用于所有新的连接,这样我每个实例只能有一个连接并重新使用它
如果可能的话,是否知道如何正确实施它以及如何处理重新连接?
答案 0 :(得分:2)
查看txredisapi库。它是redis的单独连接和连接池(持久性和非持久性)的完全扭曲实现。
我已经使用了几个月的扭曲项目,我对此非常满意。
等等,好吧,也许我错过了你想要的东西。
当我查看你的代码时,我看到了一些奇怪的东西,比如你在telnet上收到数据的redis连接,这不仅会创建一个每个telnet的连接,而且会创建一个连接。该telnet连接上的数据刷新(这几乎肯定不是你想要它做的)。
看一下examples with txredisapi它们比我用txredis看到的例子更详细
粗略地说,需要发生的是你的逻辑应该分成两部分,一部分应该是redis连接,而另一部分(基本上你现在拥有的)应该处理telnet连接和push命令通过redis连接。 txredisapi lib将为你完成所有redis工作(...和txRedis也可以,我不知道lib足够好知道,txredisapi示例应该对你有帮助)。
(这种问题在最近几天出现了很多,你可能会发现以前的答案有助于理解扭曲部分之间的常见分离,请参阅:Persistent connection in twisted)