gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:07:51 25 4
gpt4 key购买 nike

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

最佳答案

这可能是因为 stdout 缓冲。

在 Python 3.x 中,打印函数有额外的参数 flush 。默认情况下为False。也许将其设置为 True 会刷新输出缓冲区。

但是,我想指出的是:

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

您不应该以这种方式格式化字符串并形成日志消息。

正确的做法是:

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

或者也许

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

原因:最好延迟日志记录消息的创建,直到真正需要它,并且如果需要的话。

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

关于python - 队列消费者打印与日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48888738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com