Python-线程同步

多线程

案例

说明:

  1. 唱歌方法 sing()
  2. 跳舞方法 dance()
  3. 启用两个线程调用
  4. 主线程结束
  • 代码
# 导入线程模块
import threading
import timedef sing(name,age):time.sleep(2)print('唱歌者姓名:' + name + ',年龄:' + str(age))print('正在唱歌...')def dance(name, age):time.sleep(2)print('跳舞者姓名:' + name + ',年龄:' + str(age))print('正在跳舞...')if __name__ == '__main__':# args 元组传参t1 = threading.Thread(target=sing,args=('Alice', 18))# kwargs 对象传参t2 = threading.Thread(target=dance,kwargs={'name': 'Bob', 'age': 18})t1.start()t2.start()print("主线程结束")
  • 运行

在这里插入图片描述

问题现象

  • 输出的结果和代码的执行顺序不一致
  • 最后的主线程输出竟然最先输出
  • 线程的执行是异步的并非同步
  • 那么如何让线程同步执行呢?请看下一章节 《解决办法

解决办法

线程同步

  • 线程等待
  • 互斥锁

线程等待

调用线程的等待方法: join()

  • 代码
# 导入线程模块
from threading import Thread
import timedef sing(name,age):time.sleep(2)print('唱歌者姓名:' + name + ',年龄:' + str(age))print('正在唱歌...')def dance(name, age):time.sleep(2)print('跳舞者姓名:' + name + ',年龄:' + str(age))print('正在跳舞...')if __name__ == '__main__':# args 元组传参t1 = Thread(target=sing,args=('Alice', 18))# kwargs 对象传参t2 = Thread(target=dance,kwargs={'name': 'Bob', 'age': 18})t1.start()t1.join()t2.start()t2.join()print("主线程结束")
  • 运行

在这里插入图片描述

互斥锁

步骤:

  1. 导入锁模块:from threading import Lock
  2. 实例化锁:lock = Lock()
  3. 获取锁:lock.acquire()
  4. 释放锁:lock.release()
  • 代码
# 导入线程模块
from threading import Thread, Lock
import timedef sing(name, age):# 获取锁,用于线程同步lock.acquire()time.sleep(2)print('唱歌者姓名:' + name + ',年龄:' + str(age))print('正在唱歌...')# 释放锁,开启下一个线程lock.release()def dance(name, age):# 获取锁,用于线程同步lock.acquire()time.sleep(2)print('跳舞者姓名:' + name + ',年龄:' + str(age))print('正在跳舞...')# 释放锁,开启下一个线程lock.release()# 创建一个锁
lock = Lock()
if __name__ == '__main__':# args 元组传参t1 = Thread(target=sing, args=('Alice', 18))# kwargs 对象传参t2 = Thread(target=dance, kwargs={'name': 'Bob', 'age': 18})t1.start()# t1.join()t2.start()# t2.join()# print("主线程结束")
  • 运行

在这里插入图片描述

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

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

相关文章

前端八股之JS的原型链

1.原型的定义 每一个对象从被创建开始就和另一个对象关联,从另一个对象上继承其属性,这个另一个对象就是 原型。 当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去…

kafka命令

kafka安装先安装zookeeper,jdk 确保jdk版本与kafka版本匹配: 先启动zookeeper: # 启动独立安装的zookeeper ./zkServer.sh start # 也可以自动kafka自带的zookerper ./zookeeper-server-start.sh ../config/zookeeper.pr…

微服务面试(分布式事务、注册中心、远程调用、服务保护)

1.分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如: 跨数据源的分布式事务跨服务的分布式事务综合情况 我们之前解决分布式事务问题是直接使用Seata框架的AT模式,但是解决分布式事务…

Linux --进程优先级

概念 什么是进程优先级,为什么需要进程优先级,怎么做到进程优先级这是本文需要解释清楚的。 优先级的本质其实就是排队,为了去争夺有限的资源,比如cpu的调度。cpu资源分配的先后性就是指进程的优先级。优先级高的进程有优先执行的…

React 性能监控与错误上报

核心问题与技术挑战 现代 React 应用随着业务复杂度增加,性能问题和运行时错误日益成为影响用户体验的关键因素。没有可靠的监控与错误上报机制,我们将陷入被动修复而非主动预防的困境。 性能指标体系与错误分类 关键性能指标定义 // performance-me…

芒果深度学习检测:开启农业新视界(猫脸码客第230期)

芒果深度学习检测:开启农业新视界 一、引言 芒果作为热带水果中的“明星”,在全球水果市场占据着重要地位,拥有广泛的市场需求和可观的经济价值。伴随人们生活品质的提升,对芒果品质的要求也愈发严苛。芒果产业规模持续扩张&#…

PDF文件转换之输出指定页到新的 PDF 文件

背景 一份 PDF 学习资料需要打印其中某几页,文件有几百兆,看到 WPS 有PDF拆分功能,但是需要会员,开了一个月会员后完成了转换。突然想到,会员到期后如果还要拆解的话,怎么办呢?PDF 文件拆解功能…

【计网】SW、GBN、SR、TCP

目录 三种可靠传输机制(数据链路层) 停止-等待(Stop and Wait,SW)协议 回退N帧(Go-back-N,GBN)协议 选择重传(Selective Repeat,SR)协议 传输…

Go的隐式接口机制

正确使用Interface 不要照使用C/Java等OOP语言中接口的方式去使用interface。 Go的Interface的抽象不仅可以用于dynamic-dispatch 在工程上、它最大的作用是:隔离实现和抽象、实现完全的dependency inversion 以及interface segregation(SOLID principle中的I和D)。…

Async-profiler 内存采样机制解析:从原理到实现

引言 在 Java 性能调优的工具箱中,async-profiler 是一款备受青睐的低开销采样分析器。它不仅能分析 CPU 热点,还能精确追踪内存分配情况。本文将深入探讨 async-profiler 实现内存采样的多种机制,结合代码示例解析其工作原理。 为什么需要内…

Android 颜色百分比对照

本文就是简单写个demo,打印下颜色百分比的数值.方便以后使用. 1: 获取透明色 具体的代码如下: /*** 获取透明色* param percent* param red* param green* param blue* return*/public static int getTransparentColor(int percent, int red, int green, int blue) {int alp…

MPLS-EVPN笔记详述

目录 EVPN简介: EVPN路由: 基本四种EVPN路由 扩展: EVPN工作流程: 1.启动阶段: 2.流量转发: 路由次序整理: 总结: EVPN基本术语: EVPN表项: EVPN支持的多种服务模式: 简介: 1.Port Based: 简介: 配置实现: 2.VLAN Based: 简介: 配置实现: 3.VLAN Bundle: 简…

SpringBoot自定义线程池详细教程

文章目录 1. 线程池基础概念1.1 什么是线程池1.2 Java线程池核心参数1.3 线程池执行流程 2. SpringBoot中的线程池2.1 SpringBoot默认线程池2.2 SpringBoot异步任务基础 3. 自定义线程池配置3.1 配置文件方式3.2 Java配置方式3.3 线程池工厂配置 4. 异步任务实际应用4.1 业务服…

智能快递地址解析接口如何用PHP调用?

一、什么是智能快递地址解析接口 随着互联网技术的普及和电子商务的迅猛发展,网购已成为现代人日常生活的重要组成部分。然而,在这个便捷的背后,一个看似不起眼却影响深远的问题正悄然浮现——用户填写的快递地址格式混乱、信息不全甚至错漏…

概率分布,支撑AI算法的数学基石

概率分布,是现代人工智能(AI)算法不可或缺的数学语言。它不仅描述了数据中的不确定性,更揭示了机器学习模型背后的本质运作机制。本文将带你深入了解概率分布的数学本质,以及它在监督学习、深度学习、生成模型等核心AI领域的关键作用,揭秘概率论如何成为AI理论和实践的强…

2025年Splunk的替代方案:更智能的安全选择

在安全信息和事件管理(SIEM)领域,2025年的竞争愈发激烈。Splunk凭借其强大的功能和稳定性长期占据市场主导地位,但其高昂的成本、复杂性和扩展性挑战促使许多企业转向其他解决方案。无论是初创公司、快速发展的中型企业&#xff0…

(10)Fiddler抓包-Fiddler如何设置捕获Firefox浏览器的Https会话

1.简介 经过上一篇对Fiddler的配置后,绝大多数的Https的会话,我们可以成功捕获抓取到,但是有些版本的Firefox浏览器仍然是捕获不到其的Https会话,需要我们更进一步的配置才能捕获到会话进行抓包。 2.环境 1.环境是Windows 10版…

simulink mask的使用技巧

1.mask界面布局 1.1如何调整控件的位置和控件大小? 反正2020a是调不了, 找了好久,只能是调布局,例如你要调成下面这样: 第一个控件的iTem location属性选择New row 后面跟着的几个和第一个同一行的空间属性选择Cu…

Go中MAP底层原理分析

MAP底层原理分析 参考 https://golang.design/go-questions/map/principalmap | Golang 中文学习文档 先来看一下map结构体,(runtime.hmap结构体就是代表着 go 中的map,与切片一样map的内部实现也是结构体) type hmap struct {/…

#开发环境篇:postMan可以正常调通,但是浏览器里面一直报403

本地header代理下面内容即可 headers: { // 添加必要的请求头 ‘Host’: ‘服务端域名’, ‘Origin’: https://服务端域名, ‘Referer’: https://服务端域名 }, devServer: {// 本地开发代理API地址proxy: {^/file: {target: https://服务端域名,changeOrigin: true, // 是否…