【发布时间】:2018-02-20 15:30:30
【问题描述】:
在调试下面的队列示例时,我发现了一个与 Python 3.6 中的打印函数相关的奇怪行为(对我来说)。下面的代码按预期工作,但是,如果我在下面的消费者函数中用“print”函数更改“logger.info”,消费者函数就会挂起。为什么会这样?
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...
【问题讨论】:
-
可能是它的输出缓冲。在 Python 3.x 中,
print函数有额外的参数flush。默认为False。也许将其设置为True将刷新输出缓冲区。
标签: python multithreading logging queue