Beispiel #1
0
class CacheServer(TCPServer):
    """
    缓存服务器
    """
    status_fields = [
        'total_commands_processed',         # 0
        'connected_clients',                # 1
        'all_clients',                      # 2
        'total_connections_received',       # 3
        'total_connections_send',           # 4
        'slave_sync_rate',                  # 5
        'slave_sync_ok',                    # 6
    ]

    def __init__(self, config):
        self.config = config                                                    # 应用程序配置
        self.connections = 0                                                    # 连接客户端列表

        if self.config['savetime'] != 0:    # 不保存数据
            self.thread = PeriodicCallback(self.save_db,
                                       int(self.config['savetime']) * 1000)
            self.thread.start()                                                 # 背景保存服务线程启动

        self.workpool = ThreadPool(int(config['work_pool']))                    # 工作线程池

        self.status = Status(CacheServer.status_fields)                         # 服务器状态
        self.slave_clients = {}                                                 # 同步客户端
        self.is_sync = False                                                    # 是否在同步

        if self.config['master'] is not None:                                   # 从服务器启动
            shutil.rmtree(config['db'])
            self.master_server = PyCachedClient(self.config['master'][0],
                                                self.config['master'][1])
            self.master_server.sync(self.config['port'])
            self.slavepool = None
            self.slave = True                                                   # 是否为Slave模式
        else:                                                                   # 主服务器启动, 需要启动从命令工作线程

            self.slavepool = ThreadPool(int(config['slave_pool']))              # slave Command send pools
            self.slave = False                                                  # 是否为Slave模式

        self.memory = Memory(config['db'])                                      # 缓存服务类
        super(CacheServer, self).__init__()

    def handle_stream(self, stream, address):
        """
        有连接进入
        """
        if not self.is_sync:
            self.connections += 1
            ClientConnection(stream, self, address)
            self.status.inc(self.status_fields[1])
            self.status.inc(self.status_fields[2])
            logger.info("Client[%s] connection is success." % id(stream))
        else:
            logger.warn("Server sync mode don't connection")

    def close_stream(self, hashid):
        """
        客户端关闭连接
        """
        self.connections -= 0
        try:
            del self.slave_clients[hashid]
            logger.warn("Slave server[%s] leaving." % hashid)
        except KeyError:
            pass

        self.status.dec(self.status_fields[1])

        logger.info("Client[%s] connect is closed." % hashid)

    def save_db(self):
        """
        内存的数据保存到DB
        """
        self.memory.dump_db()
        
    def shutdown(self):
        """
        关闭服务器
        """
        logger.warn('PyCached server shutdown...')
        #gevent.wait()
        import os
        try:
            os.unlink(options.pid)
        except OSError:
            pass

        self.save_db()