Python 语法基础 线程 进程 协程
文章目录一 线程1创建线程2阻塞线程3互斥锁二 线程1常用成员2启动一个进程3 进程的名字4 进程的编号5 启动进程时传参6 子进程存活监测与阻塞7 进程之间的通信7.1队列7.2 进程使用队列跨进程通信三 协程1 定义2 Greenlet2.1安装2.2 使用3 Gevent3.1安装与卸载3.2 常用函数3.3 Monkey 补丁一 线程1创建线程fromthreadingimportThread#导入线程模块importtime#导入时间模块li[]#写入数据defwdata():foriinrange(5):li.append(i)time.sleep(1)print(写入的数据是,li)#读取数据defrdata():print(读取的数据是,li)if__name____main__:#创建子线程t1Thread(targetwdata)t2Thread(targetrdata)#开启子线程t1.start()t2.start()2阻塞线程if__name____main__:#创建子线程t1Thread(targetfun1)t2Thread(targetfun2)#开启子线程t1.start()t1.join()#阻塞主线程直到t1完成t2.start()t2.join()#阻塞主线程直到t2完成3互斥锁当一个锁执行时另一个线程也要使用同一个锁将会等待锁执行完成加锁后必须解锁lockLock()#声明锁 必须是公共变量lock.acquire()#加锁#代码块lock.release()#解锁fromthreadingimportThread,Lock#导入锁importtime a0b2000000lockLock()#声明锁#写入数据deffuna():lock.acquire()#加锁foriinrange(b):globala a1print(方法1a的值,a)lock.release()#解锁#读取数据deffunb():lock.acquire()foriinrange(b):globala a1print(方法2a的值,a)lock.release()if__name____main__:#创建子线程t1Thread(targetfuna)t2Thread(targetfunb)#开启子线程t1.start()t2.start()二 线程1常用成员py提供了Process类代表进程对象Process类构造参数target:执行的任务名称即子进程要执行的任务args 用元组形式传参kwargs 用字典形式传参方法start() 开启子进程isAlive() 子进程是否还活着join() 主进程等待子进程执行结束阻塞属性name 进程的名字 默认Process-N N是从递增的数字pid 进程号2启动一个进程frommultiprocessingimportProcess#导入模块defsing():print(sing)defdance():print(dance)if__name____main__:#创建子进程p1Process(targetsing)#定义进程p2Process(targetdance)p1.start()#开启进程 打印singp2.start()#dance 打印danceprint(p1,p1.name)#p1 Process-1 比sing和dance的打印先执行print(p2,p2.name)#p2 Process-2 比sing和dance的打印先执行3 进程的名字默认名字是 Process-Np1Process(targetsing)#分配默认名字p1.start()#开启进程 打印singprint(p1,p1.name)#p1 Process-1 比sing的打印先执行定义自定义名字p1Process(targetsing,name我喜欢唱歌)#创建时自定义名字p1.start()#开启进程 打印singprint(p1,p1.name)#p1 我喜欢唱歌 比sing的打印先执行#也可以用对象改p1.name我的名字4 进程的编号获取子进程编号p1Process(targetsing)p1.start()print(p1,p1.pid)#p1 44956获取当前进程和父进程的编号frommultiprocessingimportProcessimportos#导入os模块来获取当前的进程号defsing():print(sing的pid,os.getpid())print(sing的父进程pid,os.getppid())if__name____main__:p1Process(targetsing)p1.start()print(python程序的Pid,os.getpid())输出结果5 启动进程时传参frommultiprocessingimportProcessdefeat(name):print(eat,name)if__name____main__:pProcess(targeteat,args(xiaoming,))#注意单参数元组必须加逗号p.start()#eat xiaoming6 子进程存活监测与阻塞frommultiprocessingimportProcessdefeat(name):print(eat,name)if__name____main__:pProcess(targeteat,args(xiaoming,))p.start()print(p.is_alive())#永远是存活因为这里先执行子进程会稍后执行frommultiprocessingimportProcessdefeat(name):print(eat,name)if__name____main__:pProcess(targeteat,args(xiaoming,))p.start()p.join()#使用join主进程会等子进程执行完毕再执行print(p.is_alive())#False 结果永远是false7 进程之间的通信和线程不同进程之间无法共享全局变量7.1队列常用方法put()添加 先入先出如果已经满了还加程序会阻塞永远卡死get()取出empty()是否为空full()是否已经满了size()当前还有多少数据没取fromqueueimportQueue#引入模块qQueue(3)#指定队列长度空或者负值代表没有上限q.put(1)#加入一条数据q.put(第二条数据)q.put(第三条数据)print(q.get())#1 取出消息后第一条会移除print(q.get())#第二条数据print(q.empty())#False7.2 进程使用队列跨进程通信必须使用进程模块提供的Queue类才能跨进程通信普通的Queue类无法跨进程frommultiprocessingimportProcess,Queue正常情况下进程之间不会共享任何数据frommultiprocessingimportProcess,Queue li[]defwData():globalliforiinrange(5):li.append(i)print(写入,li)defrData():globalliprint(读取,li)if__name____main__:p1Process(targetwData)p2Process(targetrData)p1.start()#写入 [0, 1, 2, 3, 4]p2.start()#读取 []使用Queue可以跨进程传递数据frommultiprocessingimportProcess,QueuedefwData(q):foriinrange(5):q.put(i)print(写入,i)defrData(q):whileTrue:ifq.empty():breakelse:print(读取,q.get())if__name____main__:qQueue()#注意队列必须声明在这个if下不能放在最外层p1Process(targetwData,args(q,))p2Process(targetrData,args(q,))p1.start()#写入0 写入1 写入2 写入3 写入4p1.join()p2.start()#读取0 读取1 读取2 读取3 读取4三 协程1 定义生成器就是协程defmyCoroutine():#一个普通方法带yield自动识别为协程yieldayieldbyieldcgmyCoroutine()#协程对象print(next(g))#a 使用next执行下一个yieldprint(next(g))#bprint(next(g))#c常用于IO操作 如文件读写 网络请求2 Greenlet第三方模块封装了协程可以手动切换正在执行的任务2.1安装注意如果使用pycharm编辑会自动给项目创建一个虚拟环境如果使用windows的cmd会导致安装环境不一致所以要用pycharm的控制台安装命令pip install greenlet 或 python-m pip install greenlet卸载pip uninstall greenlet查看安装路径pip show greenlet2.2 使用基础fromgreenletimportgreenlet#引入模块#这是两个普通的方法并非生成器defsing():print(在唱歌)print(唱完了)defdance():print(在跳舞)print(跳完了)if__name____main__:g1greenlet(sing)g2greenlet(dance)g1.switch()#在唱歌 唱完了 只有见到switch才会执行g2.switch()#在跳舞 跳完了任务间切换fromgreenletimportgreenlet#引入模块#这是两个普通的方法并非生成器defsing():print(在唱歌)g2.switch()#在这里将任务切换到别的方法print(唱完了)defdance():print(在跳舞)print(跳完了)if__name____main__:g1greenlet(sing)g2greenlet(dance)g1.switch()#在唱歌 在跳舞 跳完了 执行sing的方法遇到g2.switch()切换到dance执行完danceg1.switch()#唱完了 #然后继续执行剩下的sing3 Gevent和greenlet类似但是他遇到IO操作时会自动切换程序gevent基于greenlet3.1安装与卸载注意如果使用pycharm编辑会自动给项目创建一个虚拟环境如果使用windows的cmd会导致安装环境不一致所以要用pycharm的控制台安装命令python-m pip install gevent3.2 常用函数gevent.spawn(函数名)创建协程对象 gevent.sleep()协程等待类似time.sleepgevent中必须用geven.sleep gevent.join()阻塞等待某个协程执行结束 gevent.joinall()等待所有协程对象都执行结束再退出参数是一个协程对象列表使用实例1 这里没有任何耗时操作只是为了辅助理解调度池importgeventdefsing():print(在唱歌)print(唱完了)defdance():print(在跳舞)print(跳完了)if__name____main__:#创建协程对象 将协程对象自动放入调度池但不会执行g1gevent.spawn(sing)g2gevent.spawn(dance)g2.join()#等待g2执行结束 join的作用是阻塞主线程并等待协程执行完毕 协程会按加入调度池的顺序依次执行 打印结果为 在唱歌 唱完了 在跳舞 跳完了使用实例2importgeventdefsing():print(在唱歌)gevent.sleep(1)#注意不能用time.sleepprint(唱完了)defdance():print(在跳舞)gevent.sleep(3)print(跳完了)if__name____main__:#创建协程对象 将协程对象自动放入调度池但不会执行g1gevent.spawn(sing)g2gevent.spawn(dance)g2.join()#打印结果 在唱歌 在跳舞 唱完了 没有跳完了 因为程序先执行g1,遇到sleep切换到g2g1g2的睡眠同步计时但是g1只睡1秒g2来不及执行此时程序已经退出 如果想让g2完整执行需要加上g2.join()使用实例 3 joinall的使用等所有协程执行完importgeventdefsing():print(在唱歌)gevent.sleep(1)#注意不能用time.sleepprint(唱完了)defdance():print(在跳舞)gevent.sleep(3)print(跳完了)if__name____main__:#创建协程对象 将协程对象自动放入调度池但不会执行g1gevent.spawn(sing)g2gevent.spawn(dance)gevent.joinall([g1,g2])#打印结果 在唱歌 在跳舞 一秒后唱完了 2秒后跳完了使用实例 4 传参defsing(name):print(f{name}在唱歌)gevent.sleep(1)#注意不能用time.sleepprint(唱完了)g1gevent.spawn(sing,我的名字)3.3 Monkey 补丁在模块运行时可以将原本的time.sleep 替换为gevent.sleepfromgeventimportmokey monkey.patch_all()#必须放在前边 运行时会自动把time.sleep替换为gevent.sleepdefsing(name):print(f{name}在唱歌)time.sleep(1)print(唱完了)

相关新闻

股票交易记录系统构建:Python实现自动化交易数据分析与风险监控

股票交易记录系统构建:Python实现自动化交易数据分析与风险监控

今天来看一个股票交易策略跟踪项目,这个项目以实盘记录的方式展示了一套高风险的交易方法。重点不是推荐这种策略,而是分析这类实盘记录的技术实现方式和风险控制要点。这个项目的核心特点是每日公开交易记录,承诺"一天干准一只"股…

2026/7/17 19:56:23 阅读更多 →
稳压二极管与普通二极管的核心差异与应用解析

稳压二极管与普通二极管的核心差异与应用解析

1. 稳压二极管与普通二极管的核心差异解析在电子电路设计中,二极管是最基础的元器件之一,但不同类型的二极管有着截然不同的特性。稳压二极管(齐纳二极管)和普通整流二极管虽然外观相似,但其内部工作机制和应用场景存在…

2026/7/17 19:54:23 阅读更多 →
企业级Agent在信创环境下的工程化挑战与解决方案:深度解析国产化落地路径与架构实践

企业级Agent在信创环境下的工程化挑战与解决方案:深度解析国产化落地路径与架构实践

随着2026年信创(信息技术应用创新)产业步入深水区,企业级Agent作为衔接国产底层算力与上层业务应用的核心枢纽,正成为数字化转型的关键变量。在当前系统环境下,单纯依靠通用大模型已无法满足金融、政务及大型制造等行业…

2026/7/17 19:52:22 阅读更多 →

最新新闻

基于RISC-V的CH32V208开发板WebServer实现指南

基于RISC-V的CH32V208开发板WebServer实现指南

1. 项目背景与硬件选型沁恒CH32V208开发板是一款基于RISC-V架构的无线型微控制器开发平台,搭载了沁恒自研的V4C内核。这款开发板在标准RISC-V基础上进行了多项增强设计,包括硬件堆栈区和快速中断入口机制,使得中断响应速度得到显著提升。我在…

2026/7/17 21:35:03 阅读更多 →
从零开始学AXI(八)

从零开始学AXI(八)

在AMBA AXI协议中,与突发类型相关的一个可配置属性是Wrap_CLS_Modifiable,该属性决定了当突发类型为环绕式(WRAP)时,事务是否必须满足缓存行大小且可修改。 若该属性取值为True,则表示事务必须为缓存行大小…

2026/7/17 21:35:03 阅读更多 →
微信聊天记录怎么导出成文档?4种格式实测对比,Word/Excel/PDF都能保存

微信聊天记录怎么导出成文档?4种格式实测对比,Word/Excel/PDF都能保存

上次帮一个朋友整理案件证据,她需要把前前后后三年的微信聊天记录倒出来交给法院,要是一个个截图那就太折腾了。微信那个保存聊天记录的功能她试过了,导出的是个加密文件打不开。法院要的是纸质材料或可读电子文档,不是一堆乱码。…

2026/7/17 21:35:03 阅读更多 →
Docker容器中Vim缩进配置一步搞定:Python/JS/Go多语言适配

Docker容器中Vim缩进配置一步搞定:Python/JS/Go多语言适配

1. 项目概述:为什么在 Docker 环境里还要专门搞 Vim 的 Tab 缩进?你有没有遇到过这种场景:在本地写 Python 脚本时,Vim 里按 Tab 键自动缩进 4 个空格,代码格式清爽利落;可一进到docker run -it ubuntu:22.…

2026/7/17 21:33:03 阅读更多 →
使用js-audio-recorder实现Web录音功能全解析

使用js-audio-recorder实现Web录音功能全解析

1. 项目概述 在前端开发中实现录音功能一直是个有趣且实用的需求。最近我在一个项目中使用了js-audio-recorder这个轻量级录音组件,它不仅实现了基本的录音功能,还完美解决了音频下载、播放以及Blob对象与File对象转换等常见问题。这个组件基于Web Audi…

2026/7/17 21:33:03 阅读更多 →
SVG加载动画:优势、实现与性能优化

SVG加载动画:优势、实现与性能优化

1. SVG加载动画的核心优势 作为一名前端开发者,我使用SVG制作加载动画已有五年多时间。相比传统的GIF或CSS动画,SVG加载动画具有几个不可替代的优势: 首先,SVG是矢量图形,这意味着无论放大多少倍都不会出现像素化。这…

2026/7/17 21:33:03 阅读更多 →

日新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

2026/7/17 0:02:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

2026/7/17 0:02:10 阅读更多 →
2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

现在很多用户都需要一款能适配多场景的键盘,既能满足交流码字的需求,又能应对居家电竞的性能需求,最好还得有点小颜值。而大多键盘都只能兼顾其中一两个场景。这次我实测了IQUNIX EV63三款配色(银武士、黑武士、紫罗兰&#xff09…

2026/7/17 0:04:10 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/17 3:22:28 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/17 3:01:28 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻