【发布时间】:2014-04-29 04:54:22
【问题描述】:
我正在尝试学习和了解twisted 的工作原理,为此我创建了一个基本的回显服务器,该服务器将 input 视为存储数据的 key在redis 服务器上,如果 input 匹配 DB 上的 key,它将打印出该值,否则打印 'key not found' em>。
我避免使用@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服务器的连接。
这可能是预期的行为,但我想知道,是否可以利用 twisted reactor 并在启动服务器时创建一个持久连接并将其用于所有新的连接,这样我就可以每个实例只有一个连接并重复使用它
如果可能,您知道如何正确实施它以及如何处理重新连接吗?
【问题讨论】:
标签: python redis memcached twisted