当前位置: 首页 > 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 原型对象的作用和在实际工作中的用…...

pytorch各种版本最简单安装,不用自己安装cuda cudnn

pytorch各种版本 pip 安装命令 查看官网 https://pytorch.org/get-started/previous-versions/ conda pytorch 安装 1、安装conda, 2、创建并并激活虚拟环境 - conda create -n pytorch_1.7 python3.7 - conda activate pytorch_1.7 3、虚拟环境中 pip 安装想要的…...

订单超时处理方案介绍

在电商场景下,一个订单流程中有许多环节要用到超时处理,包括但不限于: 买家超时未付款:比如超过15分钟没有支付,订单自动取消。 商家超时未发货:比如商家超过1个月没发货,订单自动取消。 买家…...

Blackbox-Exporter对服务进行探活

前言 blackbox-exporter会对HTTP、HTTPS、DNS、TCP、ICMP和gRPC上的端点进行黑盒探测。 Blackbox-Exporter blackbox-exporter暴露两个Metrics指标接口,分别是 /metrics、/probe,两个接口返回不同监控目标的指标 Metrics接口 返回exporter的构建信息…...

react-redux

Redux 是js容器,用于进行全局的 状态管理它可以用在react, angular, vue等项目中, 但基本与react配合使用三大核心: 单一数据源 整个应用的state被存储在一棵 object tree中,并且这个 object tree只存在于一个唯一的 store 中 State是只读的…...

算法刷刷刷| 回溯篇| 子集问题大集合

78.子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1…...

合并两个有序数组-力扣88-java

一、题目描述给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合…...

2022「大厂可观测」重磅回顾,12场直播,15位技术大咖洞见可观测

回首2022年,注定是意义非凡的一年。新冠疫情继续肆虐全球,中国疫情全面放开,神舟十四号与神舟十五号成功会师,俄乌冲突带来深远影响,阿根廷再次问鼎世界杯梅西圆梦,英国女王逝世......件件事都备受关注。 …...

CMMI-配置管理(CM)

一、概述配置管理(Configuration Management, CM)的目的在于使用配置识别、配置控制、配置状态记录与报告以及配置审计,来建立并维护工作产品的完整性。1、简介“配置管理”过程域涉及以下活动:• 识别所选工作产品的配…...

网络编程套接字Socket

一.什么是网络编程网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。二.为什么要实现网络编程我们通过网络编程可以在网络中获取资源,实质是通过网络,获…...

Linux进程概念(二)

进程状态1.阻塞和挂起2.R运行状态和S睡眠状态3.T停止状态4.X死亡状态和Z僵尸状态🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Linux的学习】 📝📝本…...

早那么做商城网站/杭州搜索推广公司

React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM提供了响应式 (Reactive) 和组件化 (Composable) 的视图组件。将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。区别: 1、渲染过程 Vue在渲染过…...

做网页赚钱的网站/网络推广合同

#include <stdio.h> void ConstTest(int a); //#define Pi 3.14 const float Pi 3.14;//常量在程序中是无法赋值的&#xff0c;所以定义的时候就要初始化 //枚举类型里面的元素都是常量&#xff0c;枚举变量的赋值&#xff0c;只能在这几个常量中挑选赋值 int main(int …...

商务网站建设的基本步骤/模板建站教程

愚人节&#xff08;April Fools Day 或 All Fools Day&#xff09;也称万愚节、幽默节&#xff0c;愚人节。节期为公历4月1日&#xff0c;是从19世纪开始在西方兴起流行的民间节日&#xff0c;并未被任何国家认定为法定节日。在这一天人们以各种方式互相欺骗和捉弄&#xff0c;…...

网站里面的数据库是怎么做的/哪里有学电脑培训班

/* SimpleBLEPeripheral初始化的工作&#xff1a; 1.广播数据设置 2.配对数据设置 3.Initialize GATT attributes (加服务) 4.Setup the SimpleProfile Characteristic Values&#xff08;设置特征值&#xff09; 5.注册回调函数 6.设置事件 */ SimpleBLEPeripheral_Init() {//…...

上海专业做网站的公司/软文标题例子

题意&#xff1a;车从起点出发&#xff0c;每次仅仅能行驶L长度&#xff0c;必需加油到满&#xff0c;每次仅仅能去加油站或目的地方向&#xff0c;路过加油站就必需进去加油&#xff0c;问最小要路过几次加油站。 開始时候直接建图&#xff0c;在范围内就有边1.跑最短了&#…...

网站视觉/100条经典广告语

Java的图片文件格式转换和线性缩放 来源&#xff1a;68design.net 2007年07月13日 08:31图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码&#xff0c;推荐用jimi包&#xff0c;可从 http://java.sun.com/products/jimi/ 下载该包及其源码和demo需要注意的是…...