BaseManager를 사용하여 대기열을 공유하고 있습니다. 로깅을위한 queuelistener. 이것은 Linux에서 잘 작동하지만 다음 코드에서는 "getting server"메시지가 표시되지만 "got server"로깅 메시지가 나타나지 않습니다. 그 사이의 유일한 행은 BaseManager.get_server()에 대한 호출입니다. 왜? 그것을 고칠 수 있습니까?BaseManager가 로깅을 중지하는 이유는 무엇입니까?
def server(eventq, logq):
""" publish event queue """
log = logging.getLogger()
log.handlers = [QueueHandler(logq)]
BaseManager.register('get_eventq', callable=lambda: eventq)
m = BaseManager(address=('', config["port"]), authkey=config["authkey"])
log.info("getting server")
try:
s = m.get_server()
except:
log.exception()
log.info("got server")
s.serve_forever()
def listener(eventq, logq):
""" listener for event queue """
log = logging.getLogger()
log.handlers = [QueueHandler(logq)]
log.info("starting listener")
while True:
p = Process(target=callback, args=(eventq.get(),))
p.start()
def main():
""" setup queue and listen for events
"""
# logging queue
log = logging.getLogger()
logq = Queue()
l = QueueListener(logq, *log.handlers)
l.start()
log.handlers = [QueueHandler(logq)]
# server for event queue
eventq = Queue()
p = Process(target=server, args=(eventq, logq))
p.start()
# listener
log.info("starting listener process")
p = Process(target=listener, args=(eventq, logq))
p.start()
p.join()
감사합니다. 나는 queuelistener를 사용하고있는 조리법 중 하나를 따르고 있습니다. 핸들러를 QueueHandler로 바꾸기 때문에 핸들러에 직접 할당하고 있습니다. addHandler를 사용하면 기존 핸들러가 그대로 유지되고 반복되는 각 로그 메시지로 끝납니다. get_server 다음에 sys.stdout.flush()를 추가하면 위의 코드에서 로그 메시지가 제대로 인쇄되지만 이유는 알 수 없습니다. – simon