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

python锁 (lock) 机制+多线程处理共享变量

每次 task 执行时都对一个共享变量 sum 加 2,使用线程安全的机制来确保正确性。
由于多线程的环境下,直接操作共享变量可能会导致竞争条件 (race condition),需要使用锁 (lock) 机制来防止这种情况。

下面代码展示了如何使用 threading.Lock 来保证 sum 的原子性操作:

from concurrent.futures import ThreadPoolExecutor, as_completed
import threading
import time# 共享变量
sum_value = 0
# 创建一个锁对象
lock = threading.Lock()# 定义一个简单的函数作为线程任务
def task(n):global sum_valuetime.sleep(2)with lock:sum_value += 2print(f"处理任务 {n},sum现在是 {sum_value}")return n ** 2# 创建一个线程池执行器
with ThreadPoolExecutor(max_workers=5) as executor:# 列表生成式,创建所有任务futures = [executor.submit(task, i) for i in range(10)]# as_completed(futures) 会返回一个迭代器,迭代每一次任务完成的futurefor future in as_completed(futures):# 调用future.result() 获取函数返回结果result = future.result()print(f"任务返回结果 {result}")

注意事项

  • lock = threading.Lock() 创建了一个互斥锁。
  • with lock: 确保 sum_value 的更新操作是线程安全的。
  • global sum_value 声明 sum_value 是一个全局变量,因此可以在 task 函数中修改它。

修改后的执行结果

执行上述代码时,结果将类似于以下输出(顺序可能会有所不同),并且 sum 变量将以线程安全的方式被正确更新:

处理任务 0,sum现在是 2
处理任务 1,sum现在是 4
处理任务 2,sum现在是 6
处理任务 3,sum现在是 8
处理任务 4,sum现在是 10
任务返回结果 0
任务返回结果 1
任务返回结果 4
任务返回结果 9
任务返回结果 16
处理任务 5,sum现在是 12
处理任务 6,sum现在是 14
处理任务 7,sum现在是 16
处理任务 8,sum现在是 18
处理任务 9,sum现在是 20
任务返回结果 25
任务返回结果 36
任务返回结果 49
任务返回结果 64
任务返回结果 81

每完成一个任务后,通过锁定共享变量确保 sum_value 的更新是原子的,从而防止竞争条件。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 希尔排序,详细解析(附图解)
  • yolov8旋转框+关键点检测
  • XSS GAME
  • 记录一个变量溢出的bug
  • Hive3:常用查询语句整理
  • gitlab
  • 知识竞赛答题设备及答题方式有哪些
  • 什么是应用交付控制器(ADC)
  • 【ML+DL 基础知识】信息瓶颈
  • Mybatis(面试篇)
  • git fetch和git pull的区别
  • LeetCode 算法:数组中的第K个最大元素 c++
  • 网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程
  • 数智化底座:企业迈向智能未来的关键
  • VMware vSphere Replication 虚拟机备份及迁移实践
  • Android 架构优化~MVP 架构改造
  • codis proxy处理流程
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES学习笔记(12)--Symbol
  • Hexo+码云+git快速搭建免费的静态Blog
  • IOS评论框不贴底(ios12新bug)
  • JavaScript函数式编程(一)
  • Js基础——数据类型之Null和Undefined
  • leetcode46 Permutation 排列组合
  • MYSQL 的 IF 函数
  • mysql 数据库四种事务隔离级别
  • php的插入排序,通过双层for循环
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue实战(四)登录/注册页的实现
  • 复杂数据处理
  • 开发基于以太坊智能合约的DApp
  • 坑!为什么View.startAnimation不起作用?
  • 如何编写一个可升级的智能合约
  • 三栏布局总结
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我建了一个叫Hello World的项目
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Hibernate主键生成策略及选择
  • python最赚钱的4个方向,你最心动的是哪个?
  • 阿里云ACE认证之理解CDN技术
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • !!java web学习笔记(一到五)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • ( 10 )MySQL中的外键
  • (2020)Java后端开发----(面试题和笔试题)
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (zhuan) 一些RL的文献(及笔记)
  • (二)PySpark3:SparkSQL编程