python进程、线程、协程

通过学习bi站 蚂蚁学Python 老师视频总结文档,仅用于学习。。。

python进程、线程、协程

  • 多线程:threading,利用CPU和IO可以同时执行的原理,不会让CPU干巴巴的等待IO完成

  • 多进程:multiprocessing,利用多核CPU的能力,真正的并行执行任务

  • 异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行

方法:

  • 使用Lock对资源加锁,防止冲突访问(锁起来就可以实现有序访问)

  • 使用Queue实现不同线程/进程之间的数据通信,实现生产者—消费者模式

  • 使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果

  • 使用subprocess 启动外部程序的进程,并进行输入输出交互

1. CPU密集型计算、IO密集型计算

1.1 CPU密集型(CPU-bound)

CPU密集型也叫计算密集型,是指在I/O在很短的时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高

例如:

  • 压缩和解压缩
  • 加密解密
  • 正则表达式搜索

1.2 IO密集型(I/O-bound)

IO密集型是指是,系统运作大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,CPU占用率仍然较低

例如:

  • 文件处理程序(大量读写程序)
  • 网络爬虫程序(大量网络下载,网络下载占用很长时间)
  • 读写数据库程序(网络的读取,网络开销比较多)

2. 多进程、多线程、多协程的对比

2.1 多进程(multiprocessing)

  • 优点:可以利用多核CPU并行运算

  • 缺点:占用资源最多、可启动数目比线程少

  • 适用于:CPU密集型计算

  • 一个进程可以启动N个线程

2.2 多线程(threading)

  • 优点:相比进程,更轻量级、占用资源少

  • 缺点:

    • 相比进程,多线程只能并发执行,并不能利用多CPU(GIL)
    • 相比协程,启动数目有限制,占用内存资源,有线程切换开销
  • 适用于:IO 密集型计算、同时运行的任务数目要求不多

  • 一个线程可以启动N个协程

2.3 多协程(Coroutine -> asyncio)

  • 优点:内存开销最少、启动协程数量最多
  • 缺点:支持的库有限制、代码实现复杂
  • 适用于:IO密集型计算、需要超多任务运行、但有现成库支持的场景

3. Python 的GIL

python慢的原因

  • 动态类语言,边解释边执行
  • GIL的存在导致python无法利用多核CPU并发执行

3.1 GIL是什么

全局解释器锁(Global Interpreter Lock)

是计算机程序设计语言解释器用于 同步线程的一种机制,它使得任何时刻仅有一个线程在执行

即便在多核处理器上,使用GIL的解释器也只允许同一时间执行一个线程。

在这里插入图片描述

即使电脑有多核CPU单个时刻也只能使用一个,相比较于并发加速的C++/Java慢很多

3.2 GIL 存在的原因

Python设计初期,为了规避并发问题引入了GIL,现在想去除却去除不掉了

引入GIL的原因:

  • 为了解决线程之间数据完整性状态同步问题

    • Python中对象的管理,是使用引用计数器进行的,引用数为0则释放对象

    • 例:线程A和线程B都引用的对象obj,obj.ref_num = 2,假如线程A和线程B都想撤销对obj的引用

在这里插入图片描述

  • GIL的好处简化了python对共享资源的管理

3.3 规避GIL带来的限制

1、多线程 threading 机制 还是有用的,用于IO密集型计算

  • 因为在 I/O (read、write、send、recv、etc.)期间,线程会释放 GIL , 实现CPU和IO并行,因此

    多线程用于IO密集型计算,依然可以大幅度提升速度

  • 但是,多线程用于CPU密集型计算,只会拖慢速度

2、使用 multiprocessing 的多进程机制实现并行计算、利用多核CPU优势(为了应对GIL的问题,Python提供了multiprocessing)

3.4 并发与并行

并发:

​ 指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执 行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

并行:

​ 指的是任务数小于等于cpu核数,即任务真的是一起执行的。

4. 线程

4.1 创建多线程的方法

1、准备一个函数

def my_func(a,b)do_sum(a,b)

2、怎样创建一个线程

import threading
t = threading.Thread(target=my_func, args=(100,200))  # target 表示要执行的任务(传入函数名),args表示传入函数的参数

3、启动线程

t.start()

4、等待结束

t.join()

4.2 单线程与多线程对比

import blog_spider
import threading
import time# 单线程
def single_thread():print("single_thread begin")for url in blog_spider.urls:blog_spider.craw(url)print("single_thread end")# 多线程
def multi_thread():print("multi_thread begin")threads = []for url in blog_spider.urls:threads.append(threading.Thread(target=blog_spider.craw, args=(url,)))for thread in threads:thread.start()  # 开启线程for thread in threads:thread.join()  # 等待线程结束print("multi_thread end")if __name__ == '__main__':start = time.time()  # 开始时间single_thread()end = time.time()   # 结束时间print("single thread cost:", end-start, "seconds")  # single thread cost: 8.59098196029663 secondsstart = time.time()multi_thread()end = time.time()print("multi thread cost:", end - start, "seconds")  # multi thread cost: 0.82523512840271 seconds

4.3 多线程生产消费模式

4.5 线程池

4.5.1 线程池的原理

线程的生命周期:

新建线程系统需要分配资源、终止线程系统需要回收资源,如果可以重用线程,则可以减去新建/终止的开销

4.5.2 使用线程池的好处
  • 提升性能:因为减去了大量新建、终止线程的开销,重用了线程资源
  • 适用场景:适合处理突发性大量请求或需要大量线程完成任务、但实际任务处理时间较短
  • 防御功能:能有效避免系统因为创建线程过多,而导致系统负荷过大响应变慢等问题
  • 代码优势:使用线程池的语法比自己新建线程执行线程更加简洁

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

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

相关文章

一文读懂计算计仿真技术

来源:传感器技术计算机仿真作为分析和研究系统运行行为、揭示系统动态过程和运动规律的一种重要手段和方法, 随着系统科学研究的深入、控制理论、计算技术、计算机科学与技术的发展而形成的一门新兴学科。近年来, 随着信息处理技术的突飞猛进, 使仿真技术得到迅速发…

Chrome Cookie SameSite 属性设置

Chrome Cookie SameSite 设置 Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。 Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险。 它可以设置三个值。 StrictLaxNone Chrome 默认…

胡蜂也会逻辑推理

胡蜂能通过基本的逻辑测试。来源: 中国科学报逻辑推理是一种复杂的行为,通常被认为仅限于具有复杂神经系统的动物。但一项新的研究表明,胡蜂可以运用某种逻辑推理。这在无脊椎动物中尚属首次。相关成果日前发表于英国《皇家学会生物学报》。这…

二十大未来最有潜力的新材料(绝对经典值得收藏)

来源:新材料在线石墨烯、碳纳米管、非晶合金、泡沫金属、离子液体……20种新材料,为材料工业工业发展带来无限机遇。材料工业是国民经济的基础产业,新材料是材料工业发展的先导,是重要的战略性新兴产业。今天,科技革命…

Unity3D 4.x 使用Mecanim实现动画控制

Unity3D 4.x 版本号之后提供了一种新的动画机制Mecanim,尽管眼下还支持之前的Animation。但看到Unity3D 4.3 预览版里Sprite的动画也是基于Animator的,可知Mecanim将会是以后动画播放的趋势! Mecanim是一种基于状态机的结构,不同的…

全国国家重点实验室分布总览

来源:114产学研在我国的科研平台,企业国家重点实验室、国家重点实验室和省部共建国家重点实验室在科学前沿探索和解决国家重大需求方面发挥了非常重要的作用,在科学研究方面取得不少具有国际先进水平的成果。2018年5月21日,科技部…

能源枯竭?在能源互联网时代不存在!

曹军威清华大学信息技术研究院研究员、副院长北京智中能源互联网研究院首席科学家来源:DeepTech深科技演绎inSite第十一期节目能量路由器离我们还远吗?曹军威演绎inSite演讲视频链接:以下为曹军威老师演讲文字稿:(根据…

Django3 --- ASGI

1. 什么是WSGI 1.1 CGI 解释 WSGI 之前应该先说一下什么是 CGI(通用网关接口,Common Gateway Interface,CGI),是Web 服务器运行时外部程序的规范 , 是外部扩展应用程序与 Web 服务器交互的一个标准接口。…

网络安全:等保2.0落地在即,触发五百亿新增市场

报告数据来源:华创证券、东方财富、东吴证券前 言:据公安部十一局七处处长祝国邦:《网络安全等级保护技术》2.0版本将于5月13日发布。相比等保1.0只针对网络和信息系统,等保2.0把云计算、大数据、物联网等新业态也纳入了监管&…

Django3 --- async

官方文档:https://docs.djangoproject.com/en/3.2/releases/3.0/ Django 3.0 通过提供对作为ASGI应用程序运行的支持,开始了我们使 Django 完全具有异步能力的旅程。 Django 3.1于2020年8月4日发布!从3.1版本开始,Django将逐步原…

产业|一文读懂自动驾驶汽车产业链上下游

来源: 亿欧自动驾驶汽车它的产业链上下游已经出现支撑公司,并在逐渐走向成熟。自动驾驶分级标准 关于自动驾驶的分级,主要有SAE(美国机动车工程师学会)标准和NHTSA(国家公路交通安全管理局)两个…

AI教父杰弗里辛顿:AI反学习可能揭开人类梦境的奥秘

来源:网易智能近日,多伦多大学的教员、谷歌大脑(Google Brain)研究员杰弗里辛顿(Geoffrey Hinton)发表了炉边谈话。他讨论了神经网络的起源,以及人工智能有朝一日可能像人类一样推理的可行性和意…

AttributeError: partially initialized module ‘aiohttp‘ has no attribute ‘ClientSession‘ (most...)

AttributeError: partially initialized module ‘aiohttp’ has no attribute ‘ClientSession’ (most likely due to a circular import) 问题描述: AttributeError: partially initialized module ‘aiohttp’ has no attribute ‘ClientSession’ (most likely…

AIoT重磅报告:四大关键助力,AI+IoT重新定义未来的可能性

来源:北京物联网智能技术应用协会,智能巅峰导 读随着科技的不断发展,一些在功能上具有相互补充作用的技术正在不可避免地发生结合——例如,人工智能(AI)和物联网(IoT)。在本文中,我…

python---aiohttp库

python—aiohttp库 1. 什么事aiohttp 官方网址:https://docs.aiohttp.org/en/stable/ 用于asyncio和Python的异步HTTP客户端/服务器 2. 安装 pip install aiohttp3. ClientSession() Session封装了一个连接池(connector instance)&…

关于机器学习实战,那些教科书里学不到的12个“民间智慧”

来源:towardsml机器学习算法被认为能够通过学习数据来弄清楚如何执行重要任务。这意味着数据量越大,这些算法就可以解决更加复杂的问题。然而,开发成功的机器学习应用程序需要一定的“民间技巧”,这在教科书或机器学习入门课程中很…

jsonp模拟获取百度搜索相关词汇

随便写了个jsonp模拟百度搜索相关词汇的小demo&#xff0c;帮助新手理解jsonp的用法。 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>模拟百度搜索框</title><style>*{margin: 0;padding:…

亚马逊自动打包机:1机可顶24人

来源&#xff1a;网易科技5月14日据国外媒体报道&#xff0c;电商亚马逊公司正在推出能够自动打包订购商品的机器&#xff0c;从而解放数千名员工。该项目的两名工作人员表示&#xff0c;亚马逊近年来开始在少数几个仓库中增加这项技术&#xff0c;扫描从传送带上下来的货物&am…

活着不易,5G时代终端厂商的路在何方?

来源&#xff1a;物联网智库摘要&#xff1a;站在“浮尸遍地”的通信终端的世界里&#xff0c;各大终端厂商无不面临着同一个来自灵魂的拷问&#xff1a;活着不易&#xff0c;5G时代终端厂商的路在何方&#xff1f;从1G模拟通信时代到4G移动宽带时代&#xff0c;全球手机终端厂…

图像处理 --- 一、认识图像处理

声明&#xff1a; 本系列文档由学习哔站视频总结而得&#xff0c;后续会逐渐添加相对应的示例代码&#xff08;python&#xff09; 1. 什么是图像与图像处理 百闻不如一见。 图像是客观对象的一种相似性的、生动性的描述或写真&#xff0c;是人类社会活动中最常用的信息载体…