Spaces:
Running
Running
File size: 1,522 Bytes
2b7aae2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import sys
import logging
import zmq
import types
from msgpack import unpackb, packb
from operator import methodcaller
import traceback
class ZeroServer:
def __init__(self, obj):
self.obj = obj
context = zmq.Context()
self.socket = context.socket(zmq.REP)
def __del__(self):
self.socket.close()
def res_success(self, ret):
self.socket.send(packb({
'code': 0,
'msg': 'success',
'data': ret
}, use_bin_type=True))
def res_error(self, err_type=None):
err_info = sys.exc_info()
err_msg = f"{str(err_info[0])} {str(err_info[1])} \n {''.join(traceback.format_tb(err_info[2]))}"
self.socket.send(packb({
'code': -1,
'msg': (err_type and (err_type + '\n\n')) + err_msg
}, use_bin_type=True))
logging.error('[ZeroServer.res_error] %s\n%s', err_type, err_msg)
def bind(self, port):
address = f'tcp://*:{port}'
self.socket.bind(address)
logging.info('ZeroServer is online: %s', address)
while True:
logging.info('Waiting for request...')
buf = self.socket.recv()
try:
logging.info('Got request.')
msg = unpackb(buf, raw=False, use_list=False)
method = msg.get('method')
args = msg.get('args', [])
kwargs = msg.get('kwargs', {})
try:
ret = methodcaller(method, *args, **kwargs)(self.obj)
ret = [*ret] if isinstance(ret, types.GeneratorType) else ret
self.res_success(ret)
logging.info('Response sent.')
except:
self.res_error('Server handler error:')
except:
self.res_error('Parse request params error:')
|