为什么BaseManager停止记录工作



我正在使用basemanager共享队列;和Queuelistener进行伐木。这在Linux上正常工作,但是在以下代码中的Windows上显示"获取服务器"消息显示,但" Get Server"记录消息未显示。介于两者之间的唯一界线是呼叫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则没有。我认为您的问题与记录没有联系,而是与基础多进程的实例有关。食谱示例具有使用队列的登录的多处理示例,并且您可以适应您的需求。

相关内容

  • 没有找到相关文章

最新更新