在调试下面的队列示例时,我发现了与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...
答案 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。