簡體   English   中英

為什么BaseManager停止記錄工作?

[英]Why does BaseManager stop logging working?

我正在使用BaseManager共享隊列; 和用於記錄的隊列偵聽器。 這在Linux上工作正常,但在以下代碼的Windows上,顯示“獲取服務器”消息,但未顯示“獲取服務器”日志記錄消息。 兩者之間的唯一一行是對BaseManager.get_server()的調用。 為什么? 可以解決嗎?

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

我不確定您出了什么問題(並發可能很棘手),但是您正在執行日志記錄文檔不建議的操作。 例如,你不應該分配給log.handlers直接,但使用addHandler API。 請記住,用於多處理的Windows和Linux模型是不同的-Linux使用分叉,而Windows沒有。 我認為您的問題與日志記錄無關,而更多與基礎的多進程實例化有關。 該菜譜示例包含一個使用日志記錄的多處理示例, 該示例使用隊列,並且您可能能夠適應您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM