news 2026/4/16 12:37:01

Python 多线程日志错乱:logging.Handler 的并发问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 多线程日志错乱:logging.Handler 的并发问题

Python 多线程日志错乱的原因

logging.Handler 在多线程环境下可能出现日志错乱,主要原因在于默认的 Handler 实现并非线程安全。多个线程同时调用同一 Handler 的 emit() 方法时,日志内容可能交叉混合,导致输出混乱。

解决方法:使用线程安全的 Handler

Python 标准库中的 logging.handlers.QueueHandler 和 QueueListener 专为解决多线程日志问题设计。通过将日志记录放入队列,由单独的线程处理实际写入操作。

import logging import logging.handlers import queue import threading log_queue = queue.Queue() queue_handler = logging.handlers.QueueHandler(log_queue) logger = logging.getLogger() logger.addHandler(queue_handler) logger.setLevel(logging.INFO) listener = logging.handlers.QueueListener(log_queue, logging.StreamHandler()) listener.start() def worker(): logger.info('Thread log message') threads = [] for _ in range(5): t = threading.Thread(target=worker) threads.append(t) t.start() for t in threads: t.join() listener.stop()

方法二:使用锁机制同步 Handler

如果不想使用队列,可以为自定义 Handler 添加线程锁确保线程安全:

import logging import threading class ThreadSafeHandler(logging.Handler): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.lock = threading.Lock() def emit(self, record): with self.lock: super().emit(record) handler = ThreadSafeHandler() handler.setFormatter(logging.Formatter('%(asctime)s - %(message)s')) logger = logging.getLogger() logger.addHandler(handler) logger.setLevel(logging.INFO)

方法三:每个线程使用独立 Handler

为每个线程创建独立的 Handler 实例,避免共享资源竞争:

import logging import threading def get_thread_logger(): handler = logging.StreamHandler() handler.setFormatter(logging.Formatter('%(threadName)s - %(message)s')) logger = logging.getLogger(threading.current_thread().name) logger.addHandler(handler) logger.setLevel(logging.INFO) return logger def worker(): logger = get_thread_logger() logger.info('Thread-specific log') threads = [] for i in range(3): t = threading.Thread(target=worker, name=f'Thread-{i}') threads.append(t) t.start() for t in threads: t.join()


注意事项

logging 模块本身是线程安全的,但具体 Handler 实现可能不是。FileHandler 在 Python 3.6+ 中已是线程安全,但某些第三方 Handler 仍需注意。

使用 QueueHandler 会增加少量性能开销,但对大多数应用影响不大。避免在性能关键路径中频繁记录大量日志。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:31:21

Qwen3-4B多用户并发:生产环境压力测试案例

Qwen3-4B多用户并发:生产环境压力测试案例 1. 背景与挑战 随着大模型在实际业务场景中的广泛应用,如何评估和保障其在高并发、复杂请求下的稳定性与响应性能,成为部署过程中不可忽视的关键问题。Qwen3-4B-Instruct-2507作为通义千问系列中面…

作者头像 李华
网站建设 2026/4/4 5:53:00

一月面了8家前端开发,感觉自己强的可怕

一月求职市场还没完全热起来,但我已经先冲了——前后密集面了8家前端。身边同事还在琢磨要不要跳槽、简历怎么改得更漂亮,我揣着自己做过的项目经验,直接上了战场。从初创公司的一轮技术面,到大厂那种三轮连闯,问的问题…

作者头像 李华
网站建设 2026/4/13 19:08:07

人工智能、深度学习——这些词靠热词功能更好识别

人工智能、深度学习——这些词靠热词功能更好识别 1. 技术背景与应用场景 在语音识别系统中,通用词汇的识别准确率已经达到了较高水平,但在特定领域或专业场景下,诸如“人工智能”、“深度学习”、“大模型”等术语仍可能出现误识别或漏识别…

作者头像 李华
网站建设 2026/4/15 15:31:25

TurboDiffusion高级设置:自适应分辨率与相机运动控制

TurboDiffusion高级设置:自适应分辨率与相机运动控制 1. 引言 1.1 技术背景与应用场景 视频生成技术近年来在创意内容、影视制作和数字媒体领域迅速发展。然而,传统扩散模型的高计算成本和长生成时间严重限制了其实际应用。为解决这一问题&#xff0c…

作者头像 李华
网站建设 2026/4/10 11:46:51

Open-AutoGLM实战案例:自动完成每日学习强国打卡任务

Open-AutoGLM实战案例:自动完成每日学习强国打卡任务 1. 引言 1.1 技术背景与业务痛点 在日常工作中,许多用户需要重复执行固定流程的手机操作,例如每日登录“学习强国”应用完成阅读、视听、答题等任务。这类操作虽然简单,但耗…

作者头像 李华
网站建设 2026/4/7 13:56:42

Qwen情感分析准确率提升秘籍:System Prompt优化教程

Qwen情感分析准确率提升秘籍:System Prompt优化教程 1. 引言 1.1 项目背景与技术挑战 在边缘计算和资源受限的部署场景中,如何以最小代价实现多任务AI能力,是当前工程落地的一大难题。传统方案通常采用“专用模型堆叠”策略——例如使用BE…

作者头像 李华