解决loguru在multiprocessing并发场景下子线程日志无法记录到文件问题

logger对象在创建时必须从父进程传递给子进程才能记录日志,有两种传递方式:

第一种:通过类定义一个日志变量,然后外部传入logger对象来记录日志。

# workers_a.py
class Worker:_logger = None@staticmethoddef set_logger(logger_):Worker._logger = logger_def work(self, x):self._logger.info("Square rooting {}", x)return x**0.5

第二种:通过将logger对象定义为全局变量来记录日志。

# workers_b.py
from loguru import loggerdef set_logger(logger_):global loggerlogger = logger_def work(x):logger.info("Square rooting {}", x)return x**0.5

在主程序中调用方式如下:

# main.py
from multiprocessing import Pool
from loguru import logger
import workers_a
import workers_bif __name__ == "__main__":logger.remove()logger.add("file.log", enqueue=True)worker = workers_a.Worker()with Pool(4, initializer=worker.set_logger, initargs=(logger, )) as pool:results = pool.map(worker.work, [1, 10, 100])with Pool(4, initializer=workers_b.set_logger, initargs=(logger, )) as pool:results = pool.map(workers_b.work, [1, 10, 100])logger.info("Done")

上面通过multiprocessing 中的Pool创建线程池可记录多线程执行日志。(测试正常执行)上面日志配置时需要把 enqueue=True 放开。

 但是上面有个问题:linux系统下的python线程并发与windows环境下的python线程并发调用方式不相同。linux下会通过fork创建,windows是通过spawn拷贝创建。为了避免在windows系统下运行正常的代码在linux系统下出问题,需要借助multiprocessing 的context。代码如下:

import multiprocessing
from loguru import logger
import workers_aif __name__ == "__main__":context = multiprocessing.get_context("spawn")logger.remove()logger.add("file.log", enqueue=True, context=context)worker = workers_a.Worker()with context.Pool(4, initializer=worker.set_logger, initargs=(logger, )) as pool:results = pool.map(worker.work, [1, 10, 100])

更详细内容可参考下面地址:Compatibility with multiprocessing using enqueue argument.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中英双语介绍日本东京(Tokyo)

中文版 东京介绍 东京是日本的首都,也是日本的政治、经济、文化和国际交流中心。以下是对东京的详细介绍,包括其地理位置、人口、经济、教育、文化和主要景点。 地理位置 东京位于日本关东地区的南部,地理坐标大致为北纬35度41分&#xf…

C语言_练习题

求最小公倍数 思路:假设两个数,5和7,那么最小至少也要7吧,所以先假定最小公倍数是两个数之间较大的,然后看7能不能同时整除5和7,不能就加1继续除 int GetLCM(int _num1, int _num2) {int max _num1>_n…

C++11中新特性介绍-之(二)

11.自动类型推导 (1) auto类型自动推导 auto自动推导变量的类型 auto并不代表某个实际的类型,只是一个类型声明的占位符 auto并不是万能的在任意场景下都能推导,使用auto声明的变量必须进行初始化,以让编译器推导出它的实际类型,…

Python入门 2024/7/6

目录 数据容器入门 列表的定义语法 基本语法 嵌套列表 ​编辑 列表的下表索引 ​编辑 列表的常用操作 列表的常见方法 查找元素的下标 修改下标索引的值 插入元素 追加元素 追加一批元素 删除元素 删除某元素在列表中的第一个匹配项 清空列表内容 统计元素在…

2024亚太杯中文赛数学建模B题完整论文讲解(含每一问python代码+结果+可视化图)

大家好呀,从发布赛题一直到现在,总算完成了2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题洪水灾害的数据分析与预测完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人…

web服务之Nginx

web服务之Nginx 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Li…

将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置

我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定。除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置节绑定为一个具有对应结构的符合对象。除此…

【音视频 | RTSP】RTSP协议详解 及 抓包例子解析(详细而不赘述)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命 在科技的浪潮中,华为再次引领潮流,2024年的开发者大会带来了一系列令人瞩目的创新成果。从鸿蒙操作系统的全新Beta版到盘古大模型的震撼发布,华为正以前所未有的速度重塑智能生态。以下是本次大会的亮点,让我们…

MUNIK解读ISO26262--系统架构

功能安全之系统阶段-系统架构 我们来浅析下功能安全系统阶段重要话题——“系统架构” 目录概览: 系统架构的作用系统架构类型系统架构层级的相关安全机制梳理 1.系统架构的作用 架构的思维包括抽象思维、分层思维、结构化思维和演化思维。通过将复杂系统分解…

哨兵1SAR空间数据包协议数据单元文档(七)

《哨兵1SAR空间数据包协议数据单元》文档对数据包的结构进行了详细描述,并提供了用户数据的格式和解码算法。 原文链接: 哨兵1SAR空间数据包协议数据单元文档英文版 同系列中的其他文章篇链接: 哨兵1SAR空间数据包协议数据单元文档(一) 哨兵…

lodash-es 基本使用

中文文档:https://www.lodashjs.com/ cloneDeep方法文档:https://www.lodashjs.com/docs/lodash.cloneDeep#_clonedeepvalue 参考掘金文章:https://juejin.cn/post/7354940462061715497 安装: pnpm install lodash-esnpm地址&a…

Javase-异常

文章目录 1. 异常概述2. 异常的继承结构3. 自定义异常4. 异常的处理5. 异常的使用6. finally语句块7. 方法覆盖与异常 1. 异常概述 什么是异常 ①什么是异常?有什么用? 1.Java中的异常是指程序运行时出现了错误或异常情况,导致程序无法继续正常执行的现象。例如&…

谷粒商城 - 树形菜单递归流查询、三级分类数据查询性能优化、Jmter 性能压测

目录 树形分类菜单(递归查询,强扩展) 1)需求 2)数据库表设计 3)实现 4)关于 asSequence 优化 性能压测 1)Jmeter 安装使用说明 2)中间件对性能的影响 三级分类数…

【Kubernetes】Pod 资源调度之亲和性调度

Pod 资源调度之亲和性调度 1.Node 亲和性调度1.1 Node 硬亲和性1.2 Node 软亲和性 2.Pod 亲和性调度2.1 Pod 硬亲和2.2 Pod 软亲和2.3 Pod 反亲和 Kubernetes 的 默认调度器 以 预选、优选、选定机制 完成将每个新的 Pod 资源绑定至为其选出的目标节点上,不过&#…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.7-2.8

目录 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)第二周:机器学习策略(2)(ML Strategy (2))2.7 迁移学习(Transfer learning) 第三门课 结构化机器学习项目&#xff0…

学习笔记——动态路由——IS-IS中间系统到中间系统(区域划分)

三、IS-IS区域划分 根据IS-IS路由器邻居关系,可以将IS-IS划分为两个区域——骨干区域和非骨干区域。(注意,这里的区域不是上文中提到的Area ID)由L2的IS-IS邻居构成的区域为骨干区域,由L1的IS-IS邻居构成的区域为非骨…

智能运维场景探索 | 运营分析

【本场景来源于 擎创科技《一体化数智运维AIOps解决方案》白皮书,经过重新编写】 该场景主要围绕生产运行、运营决策两个维度进行展开,通过对配置、性能、业务等运行数据的加工计算,形成可量化运营效果、可衡量发展方向的运营数据。整体以低…

基于Qt实现的PDF阅读、编辑工具

记录一下实现pdf工具功能 语言:c、qt IDE:vs2017 环境:win10 一、功能演示: 二、功能介绍: 1.基于saribbon主体界面框架,该框架主要是为了实现类似word导航项 2.加载PDF放大缩小以及预览功能 3.pdf页面跳转…

Python基础小知识问答系列-高效遍历多个不同类型元素的迭代器

1. 问题: 当需要对多个迭代器进行相同遍历操作时,如何避免因为迭代器之间的类型或者迭代器元素 数量过大引发的问题? 2. 解决方法: 使用itertools模块中的chain函数。 示例: from itertools import chainlist_a [2,…