最新要闻
- 环球观天下!反结账的钱退到哪里_反结账快捷键
- 豪掷7500万!ChatGPT开发商OpenAI买下极品域名AI.com
- 环球聚焦:为了搞死《霍格沃茨之遗》“黑巫师”们用尽了魔法
- 今日热闻!女子丽江60元买2串烧烤仅6只虫2只蝎 景区回应其吐槽:特色小吃贵
- 精准发力“二次元”群体:盈通推出“樱瞳水着”RTX 4080显卡
- 当前快讯:女子吃饭后疯狂打嗝 医生:赶紧转急诊
- 环球热推荐:全球只有18块!极品飞车特别版RTX 4090现身海鲜市场:要价1.6万
- 天天时讯:因衣服长时间放购物车被客服嘲讽 还被拉黑:遭无数网友吐槽
- 【热闻】交个朋友公司被曝欠薪、恶意裁员 罗永浩回应:第一时间协调妥善解决
- 每日快看:1099元 微星PRO MP161便携式显示屏来了:15.6寸IPS屏 仅重0.75kg
- 高速路上一觉醒来车在冒烟无人驾驶:副驾小伙慌忙跳车逃生
- 世界时讯:联想拯救者Y9000P 2023游戏本性能狂飙:满血RTX 4090、240Hz高刷
- 江西芦溪:田园春意浓 乡村美如画
- 今日热文:欧洲2035禁售燃油车!专家:电动车难完全取代燃油车
- 环球焦点!Wind11新预览版25300发布:实时字幕对中国用户更加友好!
- 当前时讯:新日登北京电动自行车不合格“黑榜”:多批电池管理系统有问题
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Python多任务教程
一.并发和并行
多任务:一定时间段内,充分利用cpu资源,同时去执行多个任务
并发: 快速交替的 去执行多任务
并行: 真正同时的 去执行多任务 ,就是同时进行
(相关资料图)
二.多进程
1.多进程入门
知识点:
进程含义: 运行中的程序
进程特点: cpu资源分配的 最小单位
多进程模块: multiprocessing
进程类: Process
使用步骤:
导包 : import multiprocessing
创建对象 : 子进程对象 = multiprocessing.Process(target=任务名)
开启进程 : 子进程对象.start()
示例:
import multiprocessingimport time# 任务1def dance(): for i in range(5): time.sleep(0.1) print("跳舞",i)# 任务2def sing(): for i in range(5): time.sleep(0.3) print("唱歌",i)# 多进程放到main内if __name__ == "__main__": # 1.创建进程对象 p1 = multiprocessing.Process(target=dance) p2 = multiprocessing.Process(target=sing) # 2.开启进程 p1.start() p2.start()
2.os模块获取进程编号
知识点:
获取当前进程id: os.getpid() pid: processing id获取父进程id: os.getppid() ppid: parent processing id
示例:
import multiprocessingimport osimport time# 任务1def dance(): print("dance子进程:", os.getpid(), os.getppid()) for i in range(5): time.sleep(0.1) print("跳舞",i)# 任务2def sing(): print("sing子进程:", os.getpid(),os.getppid()) for i in range(5): time.sleep(0.3) print("唱歌",i)# 多进程放到main内if __name__ == "__main__": print("main主进程:",os.getpid()) # 1.创建进程对象 p1 = multiprocessing.Process(target=dance) p2 = multiprocessing.Process(target=sing) # 2.开启进程 p1.start() p2.start()
3.Process()类的传参,2种方式
知识点:
args: 以元组方式传参 注意:如果只有一个参数需要加逗号, 如果多个参数顺序要任务参数顺序一致
kwargs: 以字典方式传参 注意:需要{k:v}形式传参,k必须和任务的形参名一致
示例:
import multiprocessingimport osimport time# 任务1def dance(num): print("dance子进程:", os.getpid(), os.getppid()) for i in range(num): time.sleep(0.1) print("跳舞",i)# 任务2def sing(num): print("sing子进程:", os.getpid(), os.getppid()) for i in range(num): time.sleep(0.3) print("唱歌",i)# 多进程放到main内if __name__ == "__main__": print("main主进程:", os.getpid()) # 1.创建进程对象 p1 = multiprocessing.Process(target=dance,args=(5,)) p2 = multiprocessing.Process(target=sing,kwargs={"num":5}) # 2.开启进程 p1.start() p2.start()
4.获取当前进程信息
知识点:
获取当前进程对象: multiprocessing.current_process()
获取当前进程name: multiprocessing.current_process().name
获取当前进程pid: multiprocessing.current_process().pid
示例:
import multiprocessing# 任务1def dance(): print("dance子进程对象:", multiprocessing.current_process()) print("dance子进程name:", multiprocessing.current_process().name) print("dance子进程id:", multiprocessing.current_process().pid)# 任务2def sing(): print("sing子进程对象:", multiprocessing.current_process()) print("sing子进程name:", multiprocessing.current_process().name) print("sing子进程id:", multiprocessing.current_process().pid)# 多进程放到main内if __name__ == "__main__": print("main主进程对象:", multiprocessing.current_process()) print("main主进程name:", multiprocessing.current_process().name) print("main主进程id:", multiprocessing.current_process().pid) # 1.创建进程对象 p1 = multiprocessing.Process(target=dance,name="danceProcess") p2 = multiprocessing.Process(target=sing,name="singProcess") # 2.开启进程 p1.start() p2.start()
5.注意事项
1. 多进程间不能共享全局变量:
import multiprocessingmylist = []# 写def write(): global mylist mylist = [1,2,3,4,5] print("write:",mylist) # [1, 2, 3, 4, 5]# 读def read(): global mylist print("read:",mylist) # [] 说明多个进程间不共享全局变量# 多进程需要放到main内if __name__ == "__main__": # 1.创建进程对象 p1 = multiprocessing.Process(target=write) p2 = multiprocessing.Process(target=read) # 2.开启进程 p1.start() p2.start()
2. 主进程默认等待子进程结束再结束:
import multiprocessingimport time# 任务def task(): for i in range(10): print("任务进行中...") time.sleep(0.2)# 多任务if __name__ == "__main__": # 1.创建进程对象 p1 = multiprocessing.Process(target=task) # 2.开启进程 p1.start() # 3.主进程等待0.5秒 time.sleep(0.5) print("主进程中最后一行代码....")
2. 主进程默认等待子进程结束再结束:
import multiprocessingimport time# 任务def task(): for i in range(10): print("任务进行中...") time.sleep(0.2)# 多任务if __name__ == "__main__": # 1.创建进程对象 p1 = multiprocessing.Process(target=task) # 2.开启进程 p1.start() # 3.主进程等待0.5秒 time.sleep(0.5) print("主进程中最后一行代码....")
3. 多进程执行是无序的:
import multiprocessingimport time# 任务def show(): time.sleep(2) print(multiprocessing.current_process().name)# 学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441# 多任务if __name__ == "__main__": for _ in range(5): # 创建进程对象 p = multiprocessing.Process(target=show) # 开启进程 p.start()
6.设置子进程跟着主进程一起结束#
知识点:
方式1 设置子进程守护主进程: 子进程对象.daemon = True 注意: 需要在开启进程之前设置 : daemon/ˈdiːmən/守护进程方式2 手动销毁子进程 : 子进程对象.terminate() terminate:结束,终止
1. 守护主进程:
import multiprocessingimport time# 任务def task(): for i in range(10): print("任务进行中...") time.sleep(0.2)# 多任务if __name__ == "__main__": # 1.创建进程对象 p1 = multiprocessing.Process(target=task) # 方式1: 开启子进程之前设置守护主进程 p1.daemon = True # 2.开启进程 p1.start() # 3.主进程等待0.5秒 time.sleep(0.5) print("主进程中最后一行代码....")
2. 手动销毁子进程:
import multiprocessingimport time# 任务def task(): for i in range(10): print("任务进行中...") time.sleep(0.2)# 多任务if __name__ == "__main__": # 1.创建进程对象 p1 = multiprocessing.Process(target=task) # 2.开启进程 p1.start() # 3.主进程等待0.5秒 time.sleep(0.5) print("主进程中最后一行代码....") # 方式2: 手动销毁子进程 p1.terminate()
三.多线程
1.多线程入门
知识点:
线程含义: 进程中 执行代码的 一个分支 (一个进程至少有一个线程)
线程作用: 线程是 cpu调度的 最小单位
多线程模块: threading
线程类: Thread
使用步骤:
- 导包 : import threading
- 创建对象 : 子线程对象 = threading.Thread(target=任务名)
- 开启进程 : 子线程对象.start()
示例:
import threading# 任务1def dance(): for i in range(5): print("跳舞",i)# 任务2def sing(): for i in range(5): print("唱歌",i)# 多任务if __name__ == "__main__": # 1.创建子线程对象 t1 = threading.Thread(target=dance) t2 = threading.Thread(target=sing) # 2.开启线程 t1.start() t2.start()
2.多线程的传参
知识点:
args: 以元组方式传参 注意:如果只有一个参数需要加逗号, 如果多个参数顺序要任务参数顺序一致
kwargs: 以字典方式传参 注意:需要{k:v}形式传参,k必须和任务的形参名一致
与多进程一模一样
示例:
import threading"""args: 以元组方式传参 注意:如果只有一个参数需要加逗号, 如果多个参数顺序要任务参数顺序一致kwargs: 以字典方式传参 注意:需要{k:v}形式传参,k必须和任务的形参名一致"""# 任务1def dance(num): for i in range(num): print("跳舞", i)# 任务2def sing(num): for i in range(num): print("唱歌", i)# 多任务if __name__ == "__main__": # 1.创建子线程对象 t1 = threading.Thread(target=dance,args=(5,)) t2 = threading.Thread(target=sing,kwargs={"num":5}) # 2.开启线程 t1.start() t2.start()
3.多线程注意事项
- 多线程是在一个进程中
import osimport threading"""args: 以元组方式传参 注意:如果只有一个参数需要加逗号, 如果多个参数顺序要任务参数顺序一致kwargs: 以字典方式传参 注意:需要{k:v}形式传参,k必须和任务的形参名一致"""# 任务1def dance(num): print(f"dance子线程中当前进程pid:{os.getpid()}") for i in range(num): print("跳舞", i)# 任务2def sing(num): print(f"sing子线程中当前进程pid:{os.getpid()}") for i in range(num): print("唱歌", i)# 多任务if __name__ == "__main__": print(f"main主线程中当前进程pid:{os.getpid()}") # 1.创建子线程对象 t1 = threading.Thread(target=dance,args=(5,)) t2 = threading.Thread(target=sing,kwargs={"num":5}) # 2.开启线程 t1.start() t2.start()
2. 多线程是可以共享全局变量
import threadingmylist = []# 写def write(): global mylist mylist = [1,2,3,4,5] print("write:",mylist) # [1, 2, 3, 4, 5]# 读def read(): global mylist print("read:",mylist) # [1, 2, 3, 4, 5] 访问到了write线程修改后的内容说明多线程共享全局变量if __name__ == "__main__": # 1.创建线程对象 t1 = threading.Thread(target=write) t2 = threading.Thread(target=read) # 2.开启线程 t1.start() t2.start()
3. 主线程默认等待子线程结束再结束
import threadingimport time# 任务def task(): for i in range(10): print("任务进行中...") time.sleep(0.2)# 多任务if __name__ == "__main__": # 1.创建线程对象 t = threading.Thread(target=task) # 2.开启线程 t.start() # 3.为了效果明显点,主线程等待0.5秒 time.sleep(0.5) print("主线程中最后一行代码....")
4. 多线程是无序的
import threadingimport time# 任务def show(): time.sleep(1) print(threading.current_thread().name)# 多任务if __name__ == "__main__": for _ in range(5): # 创建线程对象 p = threading.Thread(target=show) # 开启线程 p.start()
4.设置守护主线程
知识点:
方式1: daemon属性 t.daemon = True daemon/ˈdiːmən/守护进程 方式2: setDaemon()方法 t.setDaemon(True)
一个是属性,一个是方法,用哪个都可以
示例:
import threadingimport time# 任务def task(): for i in range(10): print("任务进行中...") time.sleep(0.2)# 多任务if __name__ == "__main__": # 1.创建线程对象 t = threading.Thread(target=task) # 方式1: daemon属性 # t.daemon = True # 方式2: setDaemon()方法 t.setDaemon(True) # 2.开启线程 t.start() # 3.为了效果明显点,主线程等待0.5秒 time.sleep(0.5) print("主线程中最后一行代码....")
5.获取当前线程信息
知识点:
获取当前线程对象:threading.current_thread()
获取当前线程name:threading.current_thread().name
获取当前线程id:threading.current_thread().native_id
示例:
import threadingdef dance(): print(f"dance当前线程对象:{threading.current_thread()}") print(f"dance当前线程name:{threading.current_thread().name}") print(f"dance当前线程id:{threading.current_thread().native_id}")def sing(): print(f"sing当前线程对象:{threading.current_thread()}") print(f"sing当前线程name:{threading.current_thread().name}") print(f"sing当前线程id:{threading.current_thread().native_id}")if __name__ == "__main__": print(f"main当前线程对象:{threading.current_thread()}") print(f"main当前线程name:{threading.current_thread().name}") print(f"main当前线程id:{threading.current_thread().native_id}") # 1.创建线程对象 t1 = threading.Thread(target=dance,name="DanceThread") t2 = threading.Thread(target=sing,name="SingThread") # 2.开启线程 t1.start() t2.start()
6.线程安全问题
1. 出现的线程安全问题:
import threadingsum = 0def sum1(): global sum for i in range(1000000): sum += 1 print(sum) # 1114834def sum2(): global sum for i in range(1000000): sum += 1 print(sum) # 1339347# 单任务不会出现问题 正常结果 1000000 2000000# 多任务出现了问题if __name__ == "__main__": # 1.创建线程对象 t1 = threading.Thread(target=sum1) t2 = threading.Thread(target=sum2) # 2.开启线程 t1.start() t2.start()
2. 锁机制解决线程安全问题:
import threadingsum = 0def sum1(lock): lock.acquire() # 加锁 global sum for i in range(1000000): sum += 1 print(sum) # 1000000 lock.release() # 释放锁def sum2(lock): lock.acquire() # 加锁 global sum for i in range(1000000): sum += 1 print(sum) # 2000000 lock.release() # 释放锁# 单任务不会出现问题 正常结果 1000000 2000000# 多任务出现了问题 ,利用锁机制解决问题if __name__ == "__main__": # 创建一个锁,保证两个任务用的是同一个锁 lock= threading.Lock() # 1.创建线程对象 t1 = threading.Thread(target=sum1,args=(lock,)) t2 = threading.Thread(target=sum2,args=(lock,)) # 2.开启线程 t1.start() t2.start()
3. join解决线程安全问题:
import threadingsum = 0def sum1(): global sum for i in range(1000000): sum += 1 print(sum) # 1000000def sum2(): global sum for i in range(1000000): sum += 1 print(sum) # 2000000# 学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441# 单任务不会出现问题 正常结果 1000000 2000000# 多任务出现了问题 ,利用join解决问题if __name__ == "__main__": # 1.创建线程对象 t1 = threading.Thread(target=sum1) t2 = threading.Thread(target=sum2) # 2.开启线程 t1.start() t1.join() # t1线程告诉其他线程等我执行完,你们其他线程再执行 t2.start()
四.进程和线程对比
关系
线程是依附在进程里面的,没有进程就没有线程
一个进程默认提供一条线程,进程可以创建多个线程
区别
- 进程之间不共享全局变量
- 线程之间共享全局变量,但是要注意资源竞争的问题,解决办法是互斥锁或者线程同步
- 创建进程的资源开销要比创建线程的资源开销要大
- 进程是操作系统 资源分配 的基本单位,线程是 CPU调度 的基本单位
- 线程不能够独立执行,必须依存在进程中
- 多进程开发比单进程多线程开发稳定性要强
优缺点
进程优缺点:优点:可以用多核缺点:资源开销大
线程优缺点:优点:资源开销小缺点:不能使用多核
-
全球今日讯!Xcode Swift自动格式化
XcodeSwift自动格式化安装SwiftFormatSwiftFormat是一款用来格式化Swift代码的命令行工具。直接用Homebrew安装brewinstallswiftfo
来源: Python多任务教程
每日短讯:数据结构刷题2023.02.16小记
全球今日讯!Xcode Swift自动格式化
环球观天下!反结账的钱退到哪里_反结账快捷键
豪掷7500万!ChatGPT开发商OpenAI买下极品域名AI.com
环球聚焦:为了搞死《霍格沃茨之遗》“黑巫师”们用尽了魔法
每日动态!【2023.02.16】威佐夫博弈详解
今日热闻!女子丽江60元买2串烧烤仅6只虫2只蝎 景区回应其吐槽:特色小吃贵
精准发力“二次元”群体:盈通推出“樱瞳水着”RTX 4080显卡
当前快讯:女子吃饭后疯狂打嗝 医生:赶紧转急诊
环球热推荐:全球只有18块!极品飞车特别版RTX 4090现身海鲜市场:要价1.6万
python处理xml文件
天天时讯:因衣服长时间放购物车被客服嘲讽 还被拉黑:遭无数网友吐槽
【热闻】交个朋友公司被曝欠薪、恶意裁员 罗永浩回应:第一时间协调妥善解决
每日快看:1099元 微星PRO MP161便携式显示屏来了:15.6寸IPS屏 仅重0.75kg
高速路上一觉醒来车在冒烟无人驾驶:副驾小伙慌忙跳车逃生
世界时讯:联想拯救者Y9000P 2023游戏本性能狂飙:满血RTX 4090、240Hz高刷
江西芦溪:田园春意浓 乡村美如画
记录--TS类型写不好?一起来训练提升吧!
判断一个给定数组是否为二叉搜索树后序遍历
防患未然 | AIRIOT城市管廊智能运维解决方案
全球今亮点!xcodebuild命令行工具使用详解
今日热文:欧洲2035禁售燃油车!专家:电动车难完全取代燃油车
环球焦点!Wind11新预览版25300发布:实时字幕对中国用户更加友好!
当前时讯:新日登北京电动自行车不合格“黑榜”:多批电池管理系统有问题
新消息丨不愧是玩无人机的 大疆车载产品矩阵揭秘:高阶辅助只需摄像头
这合理吗?公厕免费取纸先关注微信公众号
快资讯丨pip设置镜像
天天头条:String详解
世界时讯:开心档之Swift 访问控制
计算机导论学习记录(二)
全球微头条丨8个让你收入翻倍的高质量免费网站
重点聚焦!大疆Inspire 3无人机来了:配全画幅X9相机、可录8K视频
全球速递!用了电信5G 浙大完成中国首例5G超远程机器人肝胆手术:跨越近万里
总投资389亿!2023年第一条高铁获批:沿海超级通道定了
全球速讯:消息称腾讯XR团队全线解散:成立不到1年!
鄱阳湖旗舰店麻辣小龙虾官方大促:1.4 斤29.9元到手
深交所向新亚制程发出关注函
全球看点:USRP-2974上安装Ubuntu20.04 + UHD 3.15 + GNU Radio 3.8 过程全记录
VOP 消息仓库演进之路|如何设计一个亿级企业消息平台
【热闻】【管理您的整个软件供应链】上海道宁与Sonatype助力您以更安全的开源更快地交付产品
快看点丨西部数据推出22TB/44TB My Book桌面硬盘 售价高达1500美元
曝光交个朋友欠薪 当事人最新回应:罗永浩正积极联系公司解决
果粉买不?苹果折叠屏会先拿iPad试水!折叠iPhone风险太高了
当前热讯:想要过目不忘?进来学两招、保证不后悔!
世界热资讯!12.4万买帕纳梅拉梦碎 首单车主:保时捷傲慢 100万都不卖
环球视讯!OpenYurt v1.2 亮点速览丨云边流量峰值相比原生 K8s 降低 90%
全球百事通!堆叠柱状图怎么用?速戳!
火山引擎数智平台的这款产品,正在帮助 APP 提升用户活跃度
模型预处理层介绍(3) - IntegerLookup
CC1打不通时的另外一条链CC3
天天通讯!襄阳市消防救援训练与战勤保障大队成立
吴刚谈儿子出演《狂飙》高晓晨:既然选择这条路就要自己走
世界即时:尼泊尔载72人客机失事坠毁 初步调查报告:螺旋桨顺桨失去推力
环球信息:2023年铁路春运圆满收官:累计发送旅客3.48亿人次 增长37.4%
【天天速看料】博主分享特斯拉Model 3P一年使用成本:每公里不到4毛
卖手机壳收入百万:300多元的壳十分畅销
今热点:机器学习-随机森林
【世界独家】docker-compose搭建redis-Cluster集群
环球快资讯丨使用docker部署Python-Flask实现ChatGPT的使用
今日要闻!关于nfs服务启动messages日志中报错-Unable to watch /proc/fs/nfsd/clients: No such file
【世界聚看点】特斯拉不好惹!网红车评人“蔡老板”被判道歉赔10万后:还没饶了他
环球热点评!阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例
天天微头条丨豆瓣仅4分!《三体》动画宣布延播两周:3月4日恢复
全球新消息丨等待16年!好莱坞8.1分末日科幻大片《我是传奇》续集定了:“史皇”出演
【时快讯】罗永浩交个朋友公司被曝欠薪 员工:遭到暴力裁员
天天短讯!二次元真香升级!13代游戏本华硕天选4开启预约
大宇获恐怖电影《咒》IP授权:由《轩辕剑柒》主创张蓁元主导开发
全球观点:02月16日09时广东珠海疫情数据 阳了以后为什么会腰疼?应该怎么办?
树的子结构之先序遍历+二叉树的镜像+对称二叉树
快资讯丨一口气说出 6 种实现延时消息的方案,还有谁不会?!
快看:联发科一夜回到两年前:大家都不换新手机了
弟弟陪姐姐看病:双双确诊甲状腺癌
环球观点:RNG拖欠奖金再上热搜!前俱乐部选手站队喊话还钱
报道:父母高度近视:1岁婴儿近视600度
每日播报!Win10/11后:Linux启动AMD处理器fTPM出现同款间歇性卡顿
tplink路由器怎么重新设置密码?Tplink路由器如何桥接?
mbti哪个脾气最差?哪个mbti最容易抑郁症?
显卡驱动需要更新吗?显卡驱动怎么更新?
项羽墓在哪个地方?项羽墓为什么在山东?
卖惨是什么意思?卖惨的人是什么心理?
保龄球有几个孔?保龄球设备多少钱一套?
长安是唐朝的首都吗?长安是现在的哪个城市?
每日消息!【并查集】连通块中的数量
【热闻】(数据库系统概论|王珊)第三章关系数据库标准语言SQL:习题
Vue 组件之间传递参数
【世界聚看点】关于 layui 弹出一个 DOM 表单的问题
艾斯死的那一集是多少集?艾斯复活是哪一集?
世界最新:马斯克做出重要“交易”:开放北美全部特斯拉超充桩 换取补贴
【全球独家】5月上映!迪士尼《小美人鱼》真人电影新预告发布:特效惊艳
突破事业线
环球观天下!3000元以下唯一的16G内存手机!真我GT Neo5获得天猫京东销量冠军
死磕竞争对手ChatGPT!谷歌要求员工每天花2至4小时测试自家Bard AI
全球球精选!房地产市场支持政策需更精准
安卓导出已安装app的apk
模型预处理层介绍(2) - Hashing
世界信息:男子借朋友12万 1小时后借条变成白纸!网友:防不胜防
顶级富豪果然都惜命 扎克伯格个人安保费一年超1亿元
环球要闻:今起可提前预约个税办税:每天6-22点可在App预约
要闻:接棒年销26万台扫地机器人爆款单品!石头G10S Pure即将正式亮相