news 2026/5/15 4:05:47

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/5/12 2:25:55

Emotion2Vec+ Large长时间音频截断策略建议

Emotion2Vec Large长时间音频截断策略建议 1. 背景与问题定义 1.1 系统概述 Emotion2Vec Large 是由阿里达摩院在 ModelScope 平台上发布的高性能语音情感识别模型,具备强大的跨语言情感理解能力。该模型基于大规模多语种语音数据(42526小时&#xff…

作者头像 李华
网站建设 2026/5/11 20:51:40

动手实操YOLOv9:用官方镜像快速实现图像识别

动手实操YOLOv9:用官方镜像快速实现图像识别 在深度学习目标检测领域,YOLO(You Only Look Once)系列凭借其高速度与高精度的平衡,已成为工业界和学术界的主流选择。继YOLOv5、YOLOv8之后,YOLOv9 作为最新一…

作者头像 李华
网站建设 2026/5/9 8:27:51

5个YOLOv8部署工具推荐:镜像免配置,一键启动WebUI检测

5个YOLOv8部署工具推荐:镜像免配置,一键启动WebUI检测 1. 鹰眼目标检测 - YOLOv8 在工业级计算机视觉应用中,实时、准确、低资源消耗的目标检测能力是系统稳定运行的核心。基于 Ultralytics YOLOv8 模型构建的“鹰眼目标检测”系统&#xf…

作者头像 李华
网站建设 2026/5/11 6:13:13

JLink驱动开发核心要点:HID接口数据交互原理

深入JLink的“免驱”秘密:HID接口如何重塑嵌入式调试体验你有没有遇到过这样的场景?在客户现场准备调试一款工业控制器,插上JLink却发现Windows弹出“驱动未签名”的警告——而对方IT策略严禁安装第三方驱动。就在这尴尬时刻,同事…

作者头像 李华
网站建设 2026/4/26 1:41:56

实战应用:用通义千问3-14B快速搭建多语言翻译系统

实战应用:用通义千问3-14B快速搭建多语言翻译系统 1. 引言 1.1 多语言翻译系统的现实需求 在全球化背景下,跨语言信息交流日益频繁。无论是企业出海、学术合作还是内容本地化,高质量的多语言翻译能力已成为关键基础设施。传统机器翻译系统…

作者头像 李华
网站建设 2026/4/25 14:43:25

PDF提取避坑指南:用MinerU镜像避开格式错乱的5个常见陷阱

PDF提取避坑指南:用MinerU镜像避开格式错乱的5个常见陷阱 1. 引言:PDF文档解析的痛点与挑战 在日常工作中,处理PDF文档是许多开发者、研究人员和数据分析师不可避免的任务。然而,传统方法在面对多栏排版、复杂表格、数学公式和嵌…

作者头像 李华