队列消费者打印与日志记录

时间:2018-02-20 15:30:30

标签: python multithreading logging queue

在调试下面的队列示例时,我发现了与Python 3.6中的print函数相关的奇怪(对我而言)行为。下面的代码按预期工作,但是,如果我更改" logger.info"用" print"在下面的消费者功能中,消费者功能挂起。为什么会这样?

from queue import Queue
from threading import Thread
import logging

logging.basicConfig(format='%(asctime)s; %(name)s; %(levelname)s; %(message)s', level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.info('Starting...')


def consumer(q):
    while True:
        item = q.get()
        logger.info ("Working on item: {}".format(item))


def main():
    q = Queue()

    t = Thread(target=consumer, args=(q,))
    t.start()

    for i in range(3):
        q.put(i)

if __name__ == '__main__':
    main()

输出1:

2018-02-20 09:24:29,630; __main__; INFO; Starting...
2018-02-20 09:24:29,631; __main__; INFO; Working on item: 0
2018-02-20 09:24:29,631; __main__; INFO; Working on item: 1
2018-02-20 09:24:29,631; __main__; INFO; Working on item: 2

输出2:

2018-02-20 09:26:14,497; __main__; INFO; Starting...

1 个答案:

答案 0 :(得分:2)

可能是因为stdout缓冲。

在Python 3.x中,你有额外的参数flush用于打印功能。它默认为False。将它设置为True可能会刷新输出缓冲区。

但是,我想指出的是:

logger.info ("Working on item: {}".format(item))

你不应该format字符串并以这种方式形成记录消息。

正确的做法是:

logger.info("Working on item: %s", item)

或者

logger.info("Working on item: {item}", item=item)

原因:最好是在真正需要之前延迟记录消息的创建,如果需要的话。

您可以找到更多相关信息here