def __init__(self, confPath): """ :param confPath: 配置文件的路径 """ conf = os.path.join(confPath, 'server.json') with open(conf, 'r') as f: conf = json.load(f) self.conf = conf # 子进程通信队列 self.q = Queue() # 订阅子进程中的屏幕日志 for conf in self.conf.values(): subscriber = ZeroMQSubscriber('tcp://{}'.format( conf["logzmqhost"])) self.streamHandler = StreamHandler(sys.stdout, level="DEBUG") subscriber.dispatch_in_background(self.streamHandler) # 期货行情 conf = self.conf["easyctp"] self.easyctpProcess = Process(target=EasyctpServer.process, args=[self.q], kwargs=conf)
def start_logbook_subscriber(self): """ Run in the background the log receiver. """ subscriber = ZeroMQSubscriber('tcp://127.0.0.1:5000', multi=True) self._logbook_controller = subscriber.dispatch_in_background( self._qt_handler)
def start_logbook_subscriber(self): """ Run in the background the log receiver. """ if self._logbook_controller is None: subscriber = ZeroMQSubscriber('tcp://127.0.0.1:5000', multi=True) self._logbook_controller = subscriber.dispatch_in_background( self._qt_handler)
def get_logs_dispatcher(uri=None, debug=False): handlers = [] if not debug: handlers.append(NullHandler(level=DEBUG)) handlers.append(ColorizedStderrHandler(level=INFO)) if not uri: # Find an open port. # This is a race condition as the port could be used between # the check and its binding. However, this is probably one of the # best solution without patching Logbook. tmpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tmpsock.bind(('localhost', 0)) uri = 'tcp://{}:{}'.format(*tmpsock.getsockname()) tmpsock.close() subscriber = ZeroMQSubscriber(uri, multi=True) return uri, subscriber.dispatch_in_background(setup=NestedSetup(handlers))
def get_logs_dispatcher(uri=None, debug=False): handlers = [] if not debug: handlers.append(NullHandler(level=DEBUG)) handlers.append(ColorizedStderrHandler(level=INFO)) if not uri: # Find an open port. # This is a race condition as the port could be used between # the check and its binding. However, this is probably one of the # best solution without patching Logbook. tmpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tmpsock.bind(('localhost', 0)) uri = 'tcp://{}:{}'.format(*tmpsock.getsockname()) tmpsock.close() subscriber = ZeroMQSubscriber(uri, multi=True) return uri, subscriber.dispatch_in_background(setup=NestedSetup(handlers))
def test_zeromq_background_thread(self): from logbook.queues import ZeroMQHandler, ZeroMQSubscriber uri = 'tcp://127.0.0.1:42001' handler = ZeroMQHandler(uri) subscriber = ZeroMQSubscriber(uri) test_handler = logbook.TestHandler() controller = subscriber.dispatch_in_background(test_handler) with handler: self.log.warn('This is a warning') self.log.error('This is an error') # stop the controller. This will also stop the loop and join the # background process. Before that we give it a fraction of a second # to get all results time.sleep(0.1) controller.stop() self.assert_(test_handler.has_warning('This is a warning')) self.assert_(test_handler.has_error('This is an error'))
class Launcher(object): def __init__(self, entries='entries.json', background=True): self.entries = entries self.bg = background self.process = None self.events = {} self.event_triggers = {} def set_event(self, name, triggers, action): event = { 'triggers': list(triggers), 'state': [False] * len(triggers), 'action': action, } self.events[name] = event for trigger in triggers: self.event_triggers[trigger] = event def unset_event(self, name): for trigger in self.events[name]['triggers']: del self.event_triggers[trigger] del self.events[name] def quit(self): self.process.signal(signal.SIGINT) def kill(self): self.process.signal(signal.SIGTERM) def wait(self): self.process.wait() def _process_record(self, record): trigger = (record.channel, record.message) event = self.event_triggers.get(trigger) if not event: return event['state'][event['triggers'].index(trigger)] = True if all(event['state']): event['state'] = [False] * len(event['triggers']) event['action']() def __call__(self): # Find an open port for the logs # (that's a race condition, deal with it) tmpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tmpsock.bind(('localhost', 0)) log_uri = 'tcp://{}:{}'.format(*tmpsock.getsockname()) tmpsock.close() setup = logbook.NestedSetup([ logbook.NullHandler(), logbook.StderrHandler(level=logbook.INFO), logbook.Processor(self._process_record), ]) self.subscriber = ZeroMQSubscriber(log_uri, multi=True) self.subscriber.dispatch_in_background(setup=setup) self.process = sh.python( '-m', 'onitu', '--entries', self.entries, '--log-uri', log_uri, _bg=self.bg, ) return self.process def _on_event(self, name): log_triggers = logs[name] def caller(action, **kwargs): triggers = set((channel.format(**kwargs), message.format(**kwargs)) for (channel, message) in log_triggers) self.set_event(name, triggers, action) return caller def __getattr__(self, name): if name.startswith('on_'): return self._on_event(name[3:]) return super(Launcher, self).__getattr__(name)
class Launcher(object): def __init__(self, entries='entries.json', background=True): self.entries = entries self.bg = background self.process = None self.events = {} self.event_triggers = {} def set_event(self, name, triggers, action): event = { 'triggers': list(triggers), 'state': [False] * len(triggers), 'action': action, } self.events[name] = event for trigger in triggers: self.event_triggers[trigger] = event def unset_event(self, name): for trigger in self.events[name]['triggers']: del self.event_triggers[trigger] del self.events[name] def quit(self): self.process.signal(signal.SIGINT) def kill(self): self.process.signal(signal.SIGTERM) def wait(self): self.process.wait() def _process_record(self, record): trigger = (record.channel, record.message) event = self.event_triggers.get(trigger) if not event: return event['state'][event['triggers'].index(trigger)] = True if all(event['state']): event['state'] = [False] * len(event['triggers']) event['action']() def __call__(self): # Find an open port for the logs # (that's a race condition, deal with it) tmpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tmpsock.bind(('localhost', 0)) log_uri = 'tcp://{}:{}'.format(*tmpsock.getsockname()) tmpsock.close() setup = logbook.NestedSetup([ logbook.NullHandler(), logbook.StderrHandler(level=logbook.INFO), logbook.Processor(self._process_record), ]) self.subscriber = ZeroMQSubscriber(log_uri, multi=True) self.subscriber.dispatch_in_background(setup=setup) self.process = sh.python( '-m', 'onitu', '--entries', self.entries, '--log-uri', log_uri, _bg=self.bg, ) return self.process def _on_event(self, name): log_triggers = logs[name] def caller(action, **kwargs): triggers = set( ( channel.format(**kwargs), message.format(**kwargs) ) for (channel, message) in log_triggers ) self.set_event(name, triggers, action) return caller def __getattr__(self, name): if name.startswith('on_'): return self._on_event(name[3:]) return super(Launcher, self).__getattr__(name)