news 2026/4/25 13:57:38

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/23 11:24:37

实时大数据处理中的元数据管理挑战

实时大数据处理中的元数据管理:挑战与应对之道 副标题:从概念到实践,解决流计算场景下的元数据痛点 摘要/引言 在大数据领域,元数据(Metadata)是“数据的数据”——它记录了数据的来源、格式、结构、处理流…

作者头像 李华
网站建设 2026/4/24 19:06:16

Arduino寻迹小车系统学习:电机驱动配置

从零构建Arduino寻迹小车:电机驱动的实战配置与避坑指南你有没有遇到过这样的情况?精心写好的循迹算法逻辑清晰、传感器响应灵敏,结果小车一启动就“抽搐”几下原地打转,或者轮子转得慢如蜗牛,甚至L298N芯片烫得不敢碰…

作者头像 李华
网站建设 2026/4/23 19:23:52

OCR识别不准?cv_resnet18_ocr-detection微调训练详细步骤

OCR识别不准?cv_resnet18_ocr-detection微调训练详细步骤 1. 背景与问题分析 在实际应用中,通用OCR模型往往难以应对特定场景下的文字检测任务。例如,在工业仪表、票据识别、手写体或低质量图像中,预训练模型的检测准确率显著下…

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

收藏备用!传统RAG与Agentic RAG深度对比:从原理到代码,小白也能看懂的大模型检索增强技术指南

本文系统对比传统RAG与Agentic RAG两种主流检索增强生成技术,拆解核心差异、工作逻辑与适用场景。传统RAG以简单线性架构实现快速响应,低成本适配基础需求但准确性受限;Agentic RAG通过智能代理系统实现多步推理与动态检索,大幅提…

作者头像 李华
网站建设 2026/4/21 20:34:37

Supertonic轻量级TTS技术揭秘|66M参数实现极致性能

Supertonic轻量级TTS技术揭秘|66M参数实现极致性能 获取更多AI镜像 想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。 …

作者头像 李华
网站建设 2026/4/19 15:49:24

Speech Seaco Paraformer ASR品牌口碑监控:消费者评价语音采集

Speech Seaco Paraformer ASR品牌口碑监控:消费者评价语音采集 1. 引言 在数字化营销与用户体验管理日益重要的今天,企业对消费者真实反馈的获取方式正从传统的文本评论分析,逐步扩展到更自然、更直接的语音数据采集。尤其是在客服通话、产…

作者头像 李华