2017-11-27 6 views
0

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() 

답변

0

나는 당신이 (동시성이 까다로울 수) 잘못된거야,하지만 당신은 로깅 문서에서 권장하지 않는 일을하고 정확히 모르겠어요. 예를 들어 log.handlers에 직접 할당하지 말고 addHandler API를 사용합니다. 멀티 프로세싱을위한 Windows 및 Linux 모델은 다릅니다. Linux는 forking을 사용하지만 Windows는 그렇지 않습니다. 나는 당신의 문제가 로깅과 관련이 있다고 생각하지는 않지만, 기본 다중 프로세스 인스턴스화에 대해 더 많이 생각한다. 요리 책 예제에는 대기열을 사용하는 an example of multiprocessing with logging이 있으며 사용자의 요구에 맞출 수 있습니다.

+0

감사합니다. 나는 queuelistener를 사용하고있는 조리법 중 하나를 따르고 있습니다. 핸들러를 QueueHandler로 바꾸기 때문에 핸들러에 직접 할당하고 있습니다. addHandler를 사용하면 기존 핸들러가 그대로 유지되고 반복되는 각 로그 메시지로 끝납니다. get_server 다음에 sys.stdout.flush()를 추가하면 위의 코드에서 로그 메시지가 제대로 인쇄되지만 이유는 알 수 없습니다. – simon