Twisted 的 MemcacheProtocol 使用

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

Comments

One response to “Twisted 的 MemcacheProtocol 使用”

  1. ninny Avatar
    ninny

    我一点都不会“推”~~~~不好玩的~

Leave a Reply

Your email address will not be published. Required fields are marked *