当前位置: 首页 > news >正文

关于PYTHON Enclosing 的一个小问题

问题分析

以下是一段每隔半小时重复执行测试用例的脚本,func是传入的测试函数,在执行func前后,会打印操作次数

def repeat(func, action):try:log.info(u'******开始并发%s******' % action)thread_list = []for i in range(repeat_count):def run():log.info(u'***第%s次并发%s%svnf开始***' % (i + 1, action, concurrent_count))func(concurrent_count)log.info(u'***第%s次并发%s%svnf结束***\n' % (i + 1, action, concurrent_count))t = Thread(target=run)t.start()thread_list.append(t)time.sleep(60 * 30)log.info('\n')except Exception as e:log.error('!!!!!![%s] failed, message is[%s]!!!!!!' % (action, e.message))

这个脚本之前都能够正常执行,准备的打印操作次数,就是***第%s次并发%s%svnf开始***,以及***第%s次并发%s%svnf结束***\n

但是今天突然发现***第5次并发实例化200vnf开始***被打印了2次,这是什么情况呢?

原来是掉到闭包的坑里了!

上诉for循环中的run函数,里面的变量i位于Enclosing(嵌套函数的外层函数内部)嵌套作用域

在真正执行时,变量i的值可能已经变了,与定义闭包时的值不同

关于作用域,可以参考https://dev.zte.com.cn/topic/#/48178

上诉for循环里有个半小时的延时,如果任务能否在半小时内执行完,那么打印就会正常,因为i的值还未发生变化。但是,如果某个任务A超过半小时,for循环就会进入下一次任务,这时i就会发生变化,当任务A执行完成时,打印的次数就会是已经发生变化的i。这就是今天突然发现***第5次并发实例化200vnf开始***被打印了2次的原因

解决方案

将变量i作为参数传给run函数,run函数内部再定义一个闭包,由run函数来生成闭包。而不是直接在闭包中使用i。即将i作为参数传递给run的count,并在run内部定义inner函数,inner函数内部使用count变量。

这样count就属于run函数的Local作用域,只受run函数内部影响,不会受for循环中i的影响

def repeat(func, action):try:log.info(u'******开始并发%s******' % action)for i in range(repeat_count):def run(count):def inner():log.info(u'***第%s次并发%s%svnf开始***' % (count + 1, action, concurrent_count))func(concurrent_count)log.info(u'***第%s次并发%s%svnf结束***\n' % (count + 1, action, concurrent_count))return innert = Thread(target=run(i))t.start()time.sleep(60 * 30)log.info('\n')except Exception as e:log.error('!!!!!![%s] failed, message is[%s]!!!!!!' % (action, e.message))

总结

使用Python闭包时,如果是在for循环内部生成闭包,并且闭包中使用了Enclosing嵌套作用域中的变量(比如上面的i),最好不要直接使用,而是将变量作为参数传给一个函数,该函数内部再定义一个闭包,由该函数来生成闭包

相关文章:

关于PYTHON Enclosing 的一个小问题

问题分析 以下是一段每隔半小时重复执行测试用例的脚本,func是传入的测试函数,在执行func前后,会打印操作次数 def repeat(func, action):try:log.info(u******开始并发%s****** % action)thread_list []for i in range(repeat_count):def…...

LabVIEW错误-2147220623:最大内存块属性不存在

LabVIEW错误-2147220623:最大内存块属性不存在在使用NI Linux实时操作系统目标中,使用系统属性节点和分布式系统管理器(DSM),但遇到一些问题:它未正确报告系统上的可用物理内存量。在NI Linux实时系统上出现…...

图的总复习

一、图的定义Graph 图是由顶点vertex集合及顶点间关系集合组成的一种数据结构: 顶点的集合 和 边的集合 二、无向图 用(x,y)表示两个顶点x和y之间的一条边(edge) 边是无方向的 N{V,E},V{0…...

测试流程记录

1,需求评审 2,技术方案评审 3,编写测试用例 编写需求分析 编写测试用例 编写冒烟case 4,用例评审 5,提测 提测前给开发执行冒烟case 6,测试 测试完成前约产品验收时间 7,验收 跟进验收问题…...

Mysql主从架构与实例

mysql的主从架构 MySQL主从架构是一种常见的数据库高可用性解决方案,它通常由一个主数据库和多个从数据库组成。主数据库用于处理写入请求和读取请求,从数据库则用于处理只读请求。 在主从架构中,主数据库记录所有数据更改并将这些更改同步…...

webpack(高级)--Tapable

webpack 我们直到webpack中有两个非常重要的类Compiler和Compilation 他们通过注入插件的方式 来监听webpack的所有声明周期 插件的注入是通过创建Tapable库中的各种Hook的实例来得到 Tapable Tapable中的Hook分为同步与异步 同步 SyncHook SyncBailHook SyncWaterfallHook…...

Python常见类型转换合集

近期在工作中常常接触到各种转换,如字符串转byte,byte转字符串,还有byte数组转成报文能接纳的格式(bin格式的十六进制)。故有必要系统的总结一下Python中常见的类型转换。 一:常见类型的概念 类型举例说明…...

知识点(1)

什么是跨域请求? 当前发起请求的域与该请求指向的资源所在的域不一样,凡是发送请求的url的协议、域名、端口号三者之间任意一者与当前页面地址不同的请求。这里的域指的是:我们认为若协议域名端口号均相同,那么就是同域。 get和…...

Tomcat源码分析-启动分析(三) Catalina启动

在上一篇文章中,我们分析了tomcat的初始化过程,是由Bootstrap反射调用Catalina的load方法完成tomcat的初始化,包括server.xml的解析、实例化各大组件、初始化组件等逻辑。那么tomcat又是如何启动webapp应用,又是如何加载应用程序的…...

程序员必备的软技能-金字塔原理拆解

前言 日常工作中,常常因为思维、表达方式不对产生不想要的结果: 写了一个小时的周报,领导却不满意?跟团队讲了半天自己的想法,可别人就是没理解?看了很多知识、信息,却一点也没记住&#xff1…...

基金详细介绍

投资回报率 利润 / 投资总额(第一次投资回报率 5%) 关注南方理财 60 天债券 B(202306)万元收益 50—60 元 购基七步曲: 风险测试基本知识交易指南查看业绩了解评级在线下单赎回 基金类型: 积极成长型基金…...

媒体邀约之企业如何加强品牌的宣传力度

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。胡老师分享了许多媒体传播方面的经验,今天就跟大家分享下我对企业宣传方面的看法。企业如何加强品牌的宣传力度:1,网络宣传在社交媒体上建立企业账户&am…...

【SpringBoot】75、SpringBoot中使用spring-retry轻松解决重试

在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为…...

网络工程师必知的几个问题

路由器问题: 1、什么时候使用多路由协议? 当两种不同的路由协议要交换路由信息时,就要用到多路由协议。当然,路由再分配也可以交换路由信息。下列情况不必使用多路由协议: 从老版本的内部网关协议( interi…...

【仓库管理】搭建 Maven 私服之一--Nexus仓库(Repository)管理软件

文章目录Nexus是什么Nexus下载和安装1. 进入 Nexus 2.x 下载页面,根据本机操作系统,选择对应的版本进行下载,如下图所示。2. 将下载 Nexus 安装包解压到本地磁盘,可获得 nexus-2.14.20-02 和 sonatype-work 2 个目录,如…...

凹凸贴图(Bump Mapping)

凹凸贴图是什么? 我们首先来看low-poly(多边形数较少)mesh和high-poly(多边形数量较多)mesh之间的不同。首先,最明显的不同就是high-poly能够表现出更多细节,但high-poly有比较大的性能开销。有…...

文华财经期货指标公式量化策略分析软件,多空共振信号准确率高的公式源码

期货指标公式信号本身就有滞后性,周期越大,滞后性越久。指标公式不是100%稳赚的工具,只是在合适的时候让我们理性看待行情,减少逆势操作。 多空量化三维系统是一款通过数学分析、挖掘价格运动规律,对历史价格走势、趋势…...

基于TCP协议的文件传输系统

最简单的一对一的服务端网络端通信(socket) Socket(IP地址:端口号),例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23) socket可以理解成计算机提供给程序员的接…...

Linux定时备份MySql数据库

一、创建文件 cd / mkdir mysqlbackup vi mysqlbackup.sh然后将下面的代码更改后复制上去即可。 #!/bin/bash mysqldump -uroot -ppassword database > /mysqlbackup/database__$(date %Y%m%d_%H%M%S).sqlpassword指的是MySql的密码,database指的是所要备份的…...

JavaScript prototype(原型对象)

JavaScript 的原型(prototype)是 JavaScript 中的一个重要概念。它是一种特殊类型的对象,每个 JavaScript 对象都有一个原型对象。原型对象在 JavaScript 中起着非常重要的作用。本文将详细介绍 JavaScript 原型对象的作用和在实际工作中的用…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...