def subscribe_gevent(handler_dict, project_name, addr, msgpass_server=None): ''' 注册消息接受处理函数 msg: func(content) 返回值根据情况处理 server.stop() ''' import gevent from gevent.server import StreamServer from gevent import spawn def handle(sock, addr): global __is_running while __is_running: try: with gevent.Timeout(2): l = recvall(sock, 4) if not l: break data = recvall(sock, int(struct.unpack('I', l)[0])) if not data: break sock.send(RET_OK) data = json.loads(data) func = handler_dict.get(data.get('msg')) if func: spawn(func, data.get('data')) except gevent.Timeout: continue except: log.error(traceback.format_exc()) break ip, port = addr.split(':', 1) port = int(port) server = StreamServer(('0.0.0.0', port), handle=handle) spawn(server.serve_forever) log.info('server=MsgPass|func=listen|port=%d', port) for i in msgpass_server or MSGPASS_CONF: client = ThriftClient(i, MsgPass) client.open() client.subscribe(handler_dict.keys(), project_name, addr) client.close() return server
def subscribe_thread(handler_dict, project_name, addr, pool_size=10, msgpass_server=None): ''' 注册消息接受处理函数 msg: func(content) 返回值根据情况处理 server.shutdown() server.server_close() ''' from qfcommon.server.threadpool import ThreadPool, Task from SocketServer import ThreadingTCPServer, BaseRequestHandler import threading pool = ThreadPool(pool_size) pool.start() class SimpleTask(Task): def run(self): return self._func(*self._args, **self._kwargs) class Handler(BaseRequestHandler): def handle(self): while 1: try: l = self.request.recv(4) if not l: break data = self.request.recv(int(struct.unpack('I', l)[0])) if not data: break self.request.send(RET_OK) data = json.loads(data) func = handler_dict.get(data.get('msg')) if func: task = SimpleTask(func, data.get('data')) self.server.pool.add(task) except: log.error(traceback.format_exc()) break ip, port = addr.split(':', 1) port = int(port) server = ThreadingTCPServer(('0.0.0.0', port), Handler) server.pool = pool server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() log.info('server=MsgPass|func=listen|port=%d', port) for i in msgpass_server or MSGPASS_CONF: client = ThriftClient(i, MsgPass) client.open() client.subscribe(handler_dict.keys(), project_name, addr) client.close() return server