def __init__(self, args): self.args = args self.context = zmq.Context() self.sock = self.context.socket(zmq.REP) if platform.system() == 'Windows': # Windows에서는 Process기반 queue device 실행 # 다른 프로토콜 사용 불가능 from zmq.devices import ProcessDevice device = ProcessDevice(zmq.QUEUE, zmq.ROUTER, zmq.DEALER) device.bind_in(f"tcp://*:{args.frontend_port}") device.bind_out(f"tcp://*:{args.backend_port}") device.setsockopt_in(zmq.IDENTITY, 'ROUTER'.encode()) device.setsockopt_out(zmq.IDENTITY, 'DEALER'.encode()) device.start() self.sock.connect("tcp://localhost:{}".format(args.backend_port)) else: # Linux에서는 backend protocol을 tcp보다 빠른 # inproc (inter-process)를 사용하고, # thread 기반 queue device를 실행 import threading _device = threading.Thread( target=device_func, args=(self.context, f"tcp://*:{args.frontend_port}", f"inproc://backend"), ) _device.start() self.sock.connect(f"inproc://backend")
def router_dealer(client_uri, internal_uri): pd = ProcessDevice(zmq.QUEUE, zmq.ROUTER, zmq.DEALER) pd.bind_in(client_uri) pd.bind_out(internal_uri) pd.setsockopt_in(zmq.IDENTITY, 'ROUTER') pd.setsockopt_out(zmq.IDENTITY, 'DEALER') return pd
def __init__(self, args): self.args = args self.context = zmq.Context() self.sock = self.context.socket(zmq.REP) self.pool = set(["Opp2Bot", "OppBotBattle", "OppBotBattleNoRaven", \ "OppBotTank", "OppBotBanshee", "OppBotFlashNew", "OppBotFlashNewRaven", "OppBotFlashFast", "OppBotMagic", "1", "2", "3", "4"]) self.win = dict() for p in self.pool: self.win[p] = [] if platform.system() == 'Windows': # Windows에서는 Process기반 queue device 실행 # 다른 프로토콜 사용 불가능 from zmq.devices import ProcessDevice device = ProcessDevice(zmq.QUEUE, zmq.ROUTER, zmq.DEALER) device.bind_in(f"tcp://*:{args.frontend_port}") device.bind_out(f"tcp://*:{args.backend_port}") device.setsockopt_in(zmq.IDENTITY, 'ROUTER'.encode()) device.setsockopt_out(zmq.IDENTITY, 'DEALER'.encode()) device.start() self.sock.connect("tcp://localhost:{}".format(args.backend_port)) else: # Linux에서는 backend protocol을 tcp보다 빠른 # inproc (inter-process)를 사용하고, # thread 기반 queue device를 실행 import threading _device = threading.Thread( target=device_func, args=(self.context, f"tcp://*:{args.frontend_port}", f"inproc://backend"), ) _device.start() self.sock.connect(f"inproc://backend")
def forwarder_device(port_in, port_out): from zmq.devices import ProcessDevice pd = ProcessDevice(zmq.FORWARDER, zmq.SUB, zmq.PUB) pd.bind_in('tcp://*:%s' % port_in) pd.bind_out('tcp://*:%s' % port_out) pd.setsockopt_in(zmq.IDENTITY, 'SUB') pd.setsockopt_in(zmq.SUBSCRIBE, "") pd.setsockopt_out(zmq.IDENTITY, 'PUB') pd.start()
def streamer_device(port_in, port_out): from zmq.devices import ProcessDevice pd = ProcessDevice(zmq.QUEUE, zmq.PULL, zmq.PUSH) pd.bind_in('tcp://*:%s' % port_in) pd.bind_out('tcp://*:%s' % port_out) pd.setsockopt_in(zmq.IDENTITY, 'PULL') pd.setsockopt_out(zmq.IDENTITY, 'PUSH') pd.start()
def run_zmq_server(): streamerdevice = ProcessDevice(zmq.STREAMER, zmq.PULL, zmq.PUSH) zmq_in = f"ipc:///tmp/pd_in_{int(time())}_{randint(0, 1000)}" zmq_out = f"ipc:///tmp/pd_in_{int(time())}_{randint(0, 1000)}" streamerdevice.bind_in(zmq_in) streamerdevice.bind_out(zmq_out) streamerdevice.setsockopt_in(zmq.IDENTITY, b'PULL') streamerdevice.setsockopt_out(zmq.IDENTITY, b'PUSH') streamerdevice.start() return streamerdevice, zmq_in, zmq_out
class EntityAPIServer(multiprocessing.Process): ''' EntityAPIServer implementation as a Queue with multiple backend services''' def __init__(self): super(EntityAPIServer,self).__init__() self.processDevice = None self.workers = [] pass def setup(self): ''' Setup the necessary infrastructure for the server ''' self.__setupQueueProcess() self.__setupWorkers() def __setupQueueProcess(self): ''' Set up a zmq Queue ProcessDevice ''' self.processDevice = ProcessDevice(zmq.QUEUE, zmq.XREP, zmq.XREQ) self.processDevice.bind_in("%s://%s:%s" % (CONST.FRONTEND_SOCKET["proto"],CONST.FRONTEND_SOCKET["addr"],CONST.FRONTEND_SOCKET["port"])) self.processDevice.bind_out("%s://%s:%s" % (CONST.SERVICE_SOCKET["proto"],CONST.SERVICE_SOCKET["addr"],CONST.SERVICE_SOCKET["port"])) self.processDevice.setsockopt_in(zmq.IDENTITY, 'ROUTER') self.processDevice.setsockopt_out(zmq.IDENTITY, 'DEALER') def __setupWorkers(self): ''' Setup N workers depending on the application configuration ''' for i in range(CONST.WORKER_SERVICES_COUNT): print("Creating worker process:%d"% (i+1)) workerProc = EntityAPIWorker (host= CONST.SERVICE_SOCKET["addr"], port = CONST.SERVICE_SOCKET["port"] , workerID = i+1 ) self.workers.append(workerProc) def run(self): self.setup() print("Initiating Queue") self.processDevice.start() print("Starting Workers") for worker in self.workers: worker.start() for worker in self.workers: worker.join() def stop(self): if self.workers: for worker in self.workers: worker.stop()
class Server(object): def __init__(self, db, client_uri, internal_uri, lock_uri): self.client_uri = client_uri self.internal_uri = internal_uri self.rep_uri = internal_uri.replace("*", "localhost") self.lock_uri = lock_uri self.db = db self.pd = ProcessDevice(zmq.QUEUE, zmq.ROUTER, zmq.DEALER) self.pd.bind_in(self.client_uri) self.pd.bind_out(self.internal_uri) self.pd.setsockopt_in(zmq.IDENTITY, 'ROUTER') self.pd.setsockopt_out(zmq.IDENTITY, 'DEALER') self.running = False def start(self): self.pd.start() self.context = zmq.Context() self.socket = self.context.socket(zmq.REP) self.socket.connect(self.rep_uri) def run(self): self.running = True while self.running: message = self.socket.recv() logging.debug("Received request: %s" % message) try: message = json.loads(message) if message["mode"] == "exec": # Make extra checks here old_stdout = sys.stdout stdout = sys.stdout = StringIO() try: co = compile(message["command"], "<remote>", "single") exec co in globals() except: output = sys.exc_info() else: output = stdout.getvalue() sys.stdout = old_stdout elif message["mode"] == "readall": output = db elif message["mode"] == "lock": output = {"locked": True, "uri": self.lock_uri} elif message["mode"] == "unlock": output = {"locked": False} else: entry = self.db for key in message["index"]: entry = entry[key] if not message.get("func"): output = entry else: func = getattr(entry, message["func"]) message["args"] = deepwrap(message["args"], entry.callbacks, entry.undocallbacks, self.db.wrapfile, skiproot=True) message["kwargs"] = deepwrap(message["kwargs"], entry.callbacks, entry.undocallbacks, self.db.wrapfile, skiproot=True) output = func(*message["args"], **message["kwargs"]) except: output = traceback.format_exc() logging.error(traceback.print_exc()) if type(output).__name__ in ['listiterator', 'dictionary-keyiterator']: output = list(output) try: output = json.dumps(output, cls=Encoder) except: output = str(output) self.socket.send(output) if message["mode"] == "lock": self.normal_socket = self.socket self.socket = zmq.Context().socket(zmq.REP) self.socket.bind(self.lock_uri.replace("localhost", "*")) logging.debug("Locked and listening on %s" % self.lock_uri) elif message["mode"] == "unlock": self.socket.close() self.socket = self.normal_socket logging.debug("Unlocked")
# -*- coding: utf-8 -*- import zmq from zmq.devices import ProcessDevice pd = ProcessDevice(zmq.QUEUE, zmq.ROUTER, zmq.DEALER) pd.bind_in('tcp://*:12345') pd.connect_out('tcp://127.0.0.1:5000') pd.setsockopt_in(zmq.IDENTITY, 'ROUTER') pd.setsockopt_out(zmq.IDENTITY, 'DEALER') pd.start() pd.join()