python导入的缓存机制

问题来源:

logger文件

import sysfrom loguru import loggerfrom app.internal.component.configer import settingsdef configure_logger():"""多进程环境,需要确保子进程能拿到正确初始化的logger实例:return:"""logger.remove()logger.add(settings.logFilePath, rotation=settings.logRotation, retention=settings.logRetention,enqueue=True, backtrace=True, diagnose=True, level=settings.logLevel,format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file} | {line} |{message}")logger.add(sys.stderr, enqueue=True, backtrace=True, diagnose=True, level=settings.logLevel,format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file} | {line} | {message}")
print('load logger')

main文件中调用
from app.internal.component.logger import logger
会执行print语句输出: load logger
configure_logger()
然后执行子进程
每个子进程都会有from app.internal.component.logger import logger
但没有执行print语句,且Logger.info打印的日志也没有输出

为什么会这样呢

可以说明支进程加载logger时是没有真正加载那个文件的;从gpt4上得到的答案:
Python 的模块导入机制确实包含了一个缓存机制。当你第一次导入一个模块时,Python 会执行两个主要步骤:

  • 加载:Python 查找模块,编译成字节码(如果需要的话),然后执行模块的代码。
  • 缓存:一旦模块被加载,它会被缓存到一个名为 sys.modules 的字典中。
  • sys.modules 字典是 Python 用来跟踪已经加载模块的地方。字典的键是模块的名称,值是模块对象本身。如果你尝试再次导入同一个模块,Python 会首先检查 sys.modules 来看是否已经存在一个条目,如果存在,Python 就会使用缓存的模块而不是重新加载它。这就是为什么模块级别的代码(包括打印语句、函数定义等)只会在第一次导入时执行一次的原因。

如果你想要看到这个缓存机制的实际效果,你可以这样做:

import sys# 查看sys.modules中的条目数量
print(len(sys.modules))# 导入一个新模块
import math# 再次查看sys.modules中的条目数量,应该增加了
print(len(sys.modules))# 再次导入相同的模块并不会增加sys.modules中的条目数量
import math# 数量保持不变
print(len(sys.modules))# 显示math模块的缓存对象
print(sys.modules['math'])

这个缓存机制使得模块导入在性能上更加高效,因为它避免了重复的加载和初始化过程。然而,这也意味着如果模块中有可变的状态或者执行了某些操作(比如打印信息),这些只会在第一次导入时发生。

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

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

相关文章

基于单片机的指纹采集识别系统设计

目 录 摘 要 I Abstract II 引 言 3 1 硬件选择与设计 5 1.1 总体设计及方案选择 5 1.1.1主控单片机选择 5 1.1.2传感器模块选择 6 1.1.3显示器模块选择 6 1.2 系统总体设计 7 2 系统硬件电路设计 8 2.1 系统主电路设计 8 2.1.1 主体电路设计 8 2.1.2 单片机最小系统设计 8 2.…

h5唤起微信小程序

wx-open-launch-weapp 就用这个 开放标签属于自定义标签,Vue会给予未知标签的警告,可通过配置Vue.config.ignoredElements [wx-open-launch-weapp] 来忽略Vue对开放标签的检查。 sdk授权。 调试打开时iOS会弹窗 noPermissionJsApi: [],confi…

wpscan专门针对wordpress的安全扫描工具

说明 WPScan是一款专门针对WordPress的漏洞扫描工具,它使用Ruby编程语言编写。WPScan能够扫描WordPress网站中的多种安全漏洞,包括WordPress本身的漏洞、插件漏洞和主题漏洞。此外,WPScan还能扫描类似robots.txt这样的敏感文件,并…

题目 3152: 接龙数列

题目描述: 对于一个长度为 K 的整数数列:A1, A2, . . . , AK,我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字 (2 ≤ i ≤ K)。 例如 12, 23, 35, 56, 61, 11 是接龙数列;12, 23, 34, 56 不是接龙数列,因为…

基于FPGA的PSRAM接口设计与实现

该系列为神经网络硬件加速器应用中涉及的模块接口部分,随手记录,以免时间久了遗忘。 一 PSRAM与HyperRAM 1、概述 2、异同 接口协议不同,因此在IP设计时需要注意。 Hyperram(Winbond):HyperBus协议 PSRAM(AP公司):X…

【Linux内核文档翻译】NTB驱动程序

原文&#xff1a;NTB Drivers — The Linux Kernel documentation 译者&#xff1a;jklincn <jklincnoutlook.com> 日期&#xff1a;2024.03.07 NTB 驱动程序 NTB&#xff08;Non-Transparent Bridge&#xff0c;非透明桥&#xff09;是一种 PCI-Express 桥接芯片类型&a…

CSS中position的属性有哪些,区别是什么

position有以下属性值&#xff1a; 属性值概述absolute生成绝对定位的元素&#xff0c;相对于static定位以外的一个父元素进行定位。元素的位置通过left、top、right、bottom属性进行规定。relative生成相对定位的元素&#xff0c;相对于其原来的位置进行定位。元素的位置通过…

【深度学习实践】HaGRID,YOLOv5,手势识别项目,目标检测实践项目

文章目录 数据集介绍下载数据集将数据集转换为yolo绘制几张图片看看数据样子思考类别是否转换下载yolov5修改数据集样式以符合yolov5创建 dataset.yaml训练参数开始训练训练分析推理模型转换onnx重训一个yolov5s后记 数据集介绍 https://github.com/hukenovs/hagrid HaGRID&a…

Go语言与Rust哪一个更有发展前景?

Go语言和Rust都是目前非常受欢迎的编程语言&#xff0c;它们各自具有独特的优势和适用场景。关于哪一个更有发展前景&#xff0c;这实际上取决于多个因素&#xff0c;包括个人偏好、项目需求、社区支持以及未来技术的发展趋势等。 Go语言是由Google推出的&#xff0c;具有简洁…

户外大屏:六个必备的户外大屏推广工具助你脱颖而出-华媒舍

1. 大屏幕LED显示屏 大屏幕LED显示屏是一种常见而有效的户外推广工具。它采用LED背光源和高分辨率显示屏&#xff0c;能够在户外环境中展示鲜艳丰富的图像和视频内容。这种显示屏广泛应用于广场、商业街、体育场馆等公共场所&#xff0c;成为吸引人们目光的重要工具。 大屏幕…

使用route的reject拒绝境外ip通信

#以下是centos系统格式版&#xff0c;&#xff08;win不支持&#xff0c;搜本博&#xff0c;错误路由方式处理&#xff09; curl -# -O http://ftp.apnic.net/stats/apnic/legacy-apnic-latestcat legacy-apnic-latest | grep -v * | grep -v > 1.txtsed -i s/256/24…

蓝桥杯——数组切分

数组切分 题目分析 这里要搞清楚一个点就是满足区间内数字是连续数字的区间有什么样的特点&#xff0c;既然数字连续重新排列后的数字为n,n1,n2,n3,n4,…nlen&#xff0c;则最大数字和最小数字之差恰好是区间长度减1&#xff0c;即nlen-nlen&#xff0c;同样因为下标也是连续…

释机器学习中的召回率、精确率、准确率

精确率和召回率又被叫做查准率和查全率&#xff0c;可以通过P-R图进行表示 如何理解P-R(精确率-召回率)曲线呢&#xff1f;或者说这些曲线是根据什么变化呢&#xff1f; 以逻辑回归举例&#xff0c;其输出值是0-1之间的数字。因此&#xff0c;如果我们想要判断用户的好坏&…

MySQL的索引(优缺点,二叉树,红黑数,B+Tree)【详解】

1.什么是索引 索引&#xff1a;是用于提高查询数据性能的一种数据结构。实际开发中&#xff0c;对数据的读写操作大概是10&#xff1a;1 把索引理解为目录。 构建索引的过程&#xff0c;就是构建目录的过程 构建索引的过程中会对数据进行排序 2.索引的优缺点 优点&#x…

纳米体育数据足球数据接口:实时数据包接口文档API示例⑨

纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口&#xff0c;无请求次数限制&#xff0c;可按需购买&#xff0c;接口稳定高效&#xff1b;覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。 纳米数据API2.0版本…

基于逻辑回归与决策树的地质灾害预测

大家好&#xff0c;我是带我去滑雪&#xff01; 地质灾害的预测对于人们的生命财产安全、社会稳定和经济发展具有重要意义。地质灾害如地震、泥石流、山体滑坡等往往会造成严重的人员伤亡和财产损失。大规模的地质灾害往往会导致社会秩序混乱、人员流动、灾民避难等问题&#x…

pip 和conda 更换镜像源介绍

1、前言 很多深度学习的项目免不了安装库文件、配置环境等等&#xff0c;如果利用官方提供的连接&#xff0c;网速很慢&#xff0c;而且很容易download掉。 所以配置好了虚拟环境&#xff0c;将pip换源属实重要 常见的国内镜像源有清华、中科大、阿里等等... 这里建议用中科…

前端面试——W3C标准及规范

W3C标准 1、万维网联盟标准不是某一个标准&#xff0c;而是一些列标准的集合。 简单来说可以分为结构、表现和行为 结构 主要是有HTML标签组成 表现 即指css样式表 行为 主要是有js、dom组成 web标准一般是将该三部分独立分开&#xff0c;使其更具有模块化。但一般产生行为时&…

Python yield from

yield from是Python生成器&#xff08;generator&#xff09;中的一个语法&#xff0c;用于简化生成器的操作。它可以使一个生成器委托部分操作给另一个生成器&#xff0c;从而简化代码。yield from在Python 3.3及更高版本中被引入。 在使用yield from之前&#xff0c;我们需要…

最少刷题数

最少刷题数 题目分析 对于每一名同学计算还需要再刷多少题才能保证刷题数比他多的人数不超过刷题数比他少的学生人数。我们可以考虑统计每一个分数的前缀和数组&#xff0c;sum[i]表示当前学生中&#xff0c;刷题数小于等于i的人数。那么对于学生i的刷题数a[i]&#xff0c;su…