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

6. 线程

0.大纲

线程的介绍;
多线程完成多任务:多线程步骤、无参线程、有参线程;
线程的注意点:执行顺序、共享全局变量、数据安全;
互斥锁的使用:api使用步骤、死锁;
进程与线程随笔;

1. 线程创建步骤:

步骤说明
第一步:导包import threading
第二步:通过线程类创建线程对象线程名=threading.Thread(target=函数名)
第三步:启动线程执行任务线程名.start()

图示和代码实现:无参函数和带参函数

""" 案例:演示多线程 -- 不带参数(即任务函数不带参数) 实现步骤: 1.导包 2.创建线程对象 3.启动线程 """# 1.导包importthreadingimporttime# 2.定义函数,表示 敲代码defcoding():foriinrange(1,11):time.sleep(0.1)print(f"正在敲第{i}遍代码...")# 2.定义函数,表示 听音乐defmusic():foriinrange(1,11):time.sleep(0.1)print(f"正在听第{i}遍音乐...")# 3.测试if__name__=='__main__':# 4.创建两个线程对象,分别关联上述两个目标函数p1=threading.Thread(target=coding)p2=threading.Thread(target=music)# 4.启动线程p1.start()p2.start()

""" 案例:演示多线程 -- 带参数(即任务函数带参数) 实现步骤: 1.导包 2.创建线程对象 3.启动线程 """# 1.导包importthreadingimporttime# 2.定义函数,表示 敲代码defcoding(name,num):foriinrange(1,num+1):time.sleep(0.1)print(f"{name}正在敲第{i}遍代码...")# 2.定义函数,表示 听音乐defmusic(name,count):foriinrange(1,count+1):time.sleep(0.1)print(f"{name}正在听第{i}遍音乐...")# 3.测试if__name__=='__main__':# 4.创建两个线程对象,分别关联上述两个目标函数p1=threading.Thread(target=coding,args=('小明',10))p2=threading.Thread(target=music,kwargs={'count':20,'name':'小王'})# 4.启动线程p1.start()p2.start()

2. 线程注意点:

① 线程之间的执行是无序的:线程执行具有随机性,原因是CPU在做着高效的切换;(随机性)
② 主线程会等待所有的子线程执行结束再结束:可以通过设置守护线程实现。守护主线程即主线程退出子线程销毁不再执行,实现:threading.Thread(target=函数名, daemon= True)(守护线程)
③(同一进程的)线程间 数据共享(数据共享)
④ 多线程操作共享数据,可能会出现安全问题,可以用 互斥锁解决

代码示例:

""" 案例:演示多线程特点 -- 随机性 """# 导包importthreadingimporttime# 1.定义线程的目标函数defprint_info():# 1.1 休眠time.sleep(0.2)# 1.2 获取当前线程对象current_thread=threading.current_thread()# 1.3 打印线程名称print(current_thread.name)# 2.测试if__name__=='__main__':# 2.1 创建10个线程,观察执行顺序foriinrange(10):t=threading.Thread(target=print_info)t.start()

""" 案例:演示多线程特点 -- 守护线程 """# 导包importthreading,time# 1.定义线程的目标函数defwork():foriinrange(10):time.sleep(0.2)print("工作中....")# 2.测试if__name__=='__main__':# 2.1 创建子线程# 方式一:创建时添加属性'daemon=True'# t=threading.Thread(target=work, daemon=True)# 方式二:创建完之后设置属性't.daemon=True't=threading.Thread(target=work)t.daemon=True# 2.2 启动线程t.start()# 2.3 设置主线程休眠时间time.sleep(1)

""" 案例:演示多线程特点 -- 数据共享 """#需求:定义全局变量my_list=[],定义两个目标函数分别实现添加、查看数据。# 最后创建两个线程,分别执行对应的任务,观察结果。# 导包importthreading,time# 1.定义全局变量my_list=[]# 2.定义线程的目标函数1:添加数据defwrite_data():foriinrange(1,4):my_list.append(i)print("添加数据:",i)print(f'write_data:{my_list}')# 2.定义线程的目标函数2:查看数据defread_data():time.sleep(2)print(f'read_data:{my_list}')# 3.测试if__name__=='__main__':# 3.1 创建线程并启动threading.Thread(target=write_data).start()threading.Thread(target=read_data).start()# 运行结果:# 添加数据: 1# 添加数据: 2# 添加数据: 3# write_data:[1, 2, 3]# read_data:[1, 2, 3]

http://www.jsqmd.com/news/657505/

相关文章:

  • 告别瞎摸索!Blender高效建模必装的7个神仙插件及一键配置脚本
  • AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布
  • 保姆级教程:用Matlab R2024b搞定摄像头标定,从生成棋盘格到导出参数一步不落
  • DCS World 任务编辑实战:从零构建你的第一个pydcs自动化任务
  • 别再傻傻分不清了!用Kaggle比赛实例讲透训练集、验证集和测试集到底怎么用
  • DensePose实战部署:从源码编译到避坑指南
  • ST MCSDK V6.2.0实战:手把手教你配置HSO-ST观测器,体验无感电机控制的‘快准稳’
  • 自媒体增长引擎中内容量化成垂直领域知识库的思考
  • 2026年哪家 GEO 平台性价比最高?2026年综合技术、执行、ROI与服务的深度评测与最优选择指南 - 速递信息
  • C# 实战:基于三菱PLC网络通信的两种核心连接方案解析
  • HexView脚本进阶:巧用/FR /FP参数,自动化生成带填充模式的测试固件
  • 捕捉绝对物理真实:DIC系统重构高速振动与疲劳形变的测量秩序
  • Dematel法实战:从关系矩阵到要素权重的系统影响力解码
  • 2026年,中小企业应该怎么选 GEO 平台?2026年预算有限情况下的最优决策与长期品牌建设路线图 - 速递信息
  • 2026上海紧固件专业展看什么?展览规模、展商阵容与采购价值全解析
  • 为什么92%的AI文档项目在SITS2026评审中被否?——从语义合规性到元数据溯源的全链路复盘
  • 从CAN到CANFD:一文搞懂协议差异、电平实测与车载网络升级实战
  • 国民技术 N32G031F8U7 UFQFPN-20 单片机
  • day10统计师考试(初级)用表格描述数据
  • 2026年GEO机构综合实力排名:如何找到最适合你的AI搜索优化伙伴?哪家最合适规模化宣传 - 速递信息
  • SpringBoot集成PowerJob实战:从零构建高可靠分布式任务调度平台
  • 2分钟快速解决iPhone USB网络共享问题:Windows用户的完整驱动安装指南
  • 为什么你的Copilot写不出可审计日志?2026奇点大会公布日志生成黄金标准(含ISO/IEC 27001兼容性验证)
  • 用STM32F103C8T6+JDY-32蓝牙做个智能药箱,附完整电路图与代码(避坑DS1302和OLED)
  • DeOldify与ComfyUI工作流结合:可视化节点式图像上色实践
  • 从硬件MMU到软件walk:在xv6内核里“手动”翻译一次虚拟地址(RISC-V Sv39详解)
  • 爆火收藏|大模型入门保姆级指南, 小白程序员必看,零踩坑不焦虑,快速上手不内耗
  • 用Cyclictest给你的树莓派实时内核‘体检’:参数解读、结果分析与性能优化建议
  • 关于缩微组别疯狂电路赛题T2计分规则的建议
  • IP地址访问网站,怎么去除不安全提示?