Twisted 的 defer 是个强大但是诡异的东西,遗憾的是,除了官方文档和这些文档的翻译,其他资料不多。而基于 defer 的客户端协议实现资料就更少了。Memcache 的协议实现也是利用 defer,但是除了一个单元测试的代码外,很难看到其他可以参考的实现。搞了几天,总算是有一个简单的封装,可以避开 defer,无须让所有参与开发的技术人员一定要弄懂 defer 才能用 MemCacheProtocol。
上代码吧,这样封装,应该是比较好理解的……
#!/usr/bin/evn python
# -*- coding:utf-8 -*-
'''
Created on 2010-2-7
@author: mikespook
'''
from twisted.internet import reactor, protocol
from twisted.protocols.memcache import MemCacheProtocol, DEFAULT_PORT
from pnp.log import log
class MemCache:
'''
memcache 调用接口
>>>def printResult(result):
>>> print result
>>>mc = MemCache()
>>>mc.version(printResult)
>>>reactor.callLater(1, reactor.stop)
>>>reactor.run()
'''
# 客户端创建对象
clientCreator = protocol.ClientCreator(reactor, MemCacheProtocol)
def __init__(self, host, port=DEFAULT_PORT):
'''
初始化
@param host: 主机名
@param port: 端口号
'''
self.mcDefer = self.clientCreator.connectTCP(host, port)
self.mcDefer.addErrback(self._onErr)
def _onErr(self, err):
'''
错误回调
'''
log.err(err)
def version(self, callback):
'''
获取版本
@param callback: 回调函数,结果将作为参数传递入该接口
'''
self.mcDefer.addCallback(self._mcVersion, callback)
def _mcVersion(self, proto, callback):
'''
版本回调
@param proto: twisted.p.mMemCacheProtocol
@param callback: 回调函数返回结果
'''
d = proto.version()
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
def increment(self, key, callback):
'''
增长
@param key: 键
@param callback: 回调函数
'''
self.mcDefer.addCallback(self._mcIncrement, key, callback)
def _mcIncrement(self, proto, key, callback):
'''
增长回调
@param proto: twisted.p.mMemCacheProtocol
@param key: 键
@param callback: 回调函数返回结果
'''
d = proto.increment(key)
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
def decrement(self, key, callback):
'''
减少
@param key: 键
@param callback: 回调函数
'''
self.mcDefer.addCallback(self._mcDecrement, key, callback)
def _mcDecrement(self, proto, key, callback):
'''
减少回调
@param proto: twisted.p.mMemCacheProtocol
@param key: 键
@param callback: 回调函数返回结果
'''
d = proto.decrement(key)
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
def get(self, key, callback):
'''
获取值
@param key: 键
@param callback: 回调函数
'''
self.mcDefer.addCallback(self._mcGet, key, callback)
def _mcGet(self, proto, key, callback):
'''
获取值回调
@param proto: twisted.p.mMemCacheProtocol
@param key: 键
@param callback: 回调函数返回结果
'''
d = proto.get(key)
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
def set(self, key, value, callback):
'''
设置值
@param key: 键
@param value: 值
@param callback: 回调函数
'''
self.mcDefer.addCallback(self._mcSet, key, value, callback)
def _mcSet(self, proto, key, value, callback):
'''
设置值回调
@param proto: twisted.p.mMemCacheProtocol
@param key: 键
@param value: 值
@param callback: 回调函数返回结果
'''
d = proto.set(key, value)
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
def delete(self, key, callback):
'''
删除
@param key: 键
@param value: 值
@param callback: 回调函数
'''
self.mcDefer.addCallback(self._mcDelete, key, callback)
def _mcDelete(self, proto, key, value, callback):
'''
删除回调
@param proto: twisted.p.mMemCacheProtocol
@param key: 键
@param value: 值
@param callback: 回调函数返回结果
'''
d = proto.delete(key)
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
def stats(self, callback):
'''
状态
@param key: 键
@param value: 值
@param callback: 回调函数
'''
self.mcDefer.addCallback(self._mcStats, callback)
def _mcStats(self, proto, callback):
'''
状态回调
@param proto: twisted.p.mMemCacheProtocol
@param key: 键
@param value: 值
@param callback: 回调函数返回结果
'''
d = proto.stats()
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
def flushAll(self, callback):
'''
刷新
@param key: 键
@param value: 值
@param callback: 回调函数
'''
self.mcDefer.addCallback(self._mcFlushAll, callback)
def _mcFlushAll(self, proto, callback):
'''
刷新回调
@param proto: twisted.p.mMemCacheProtocol
@param key: 键
@param value: 值
@param callback: 回调函数返回结果
'''
d = proto.flushAll()
d.addErrback(self._onErr)
d.addCallback(callback)
return proto
Leave a Reply