Python 并发编程

1.为什么要引入并发编程

场景1:一个网络爬虫,按顺序爬取花了1个小时,采用并发下载减少到20分钟!

场景2:一个APP应用,优化前每次打开页面需要3秒,采用异步并发提升到每次200毫秒。

2.有哪些程序提速的办法

 

单线程串行

单线程串行就是在同一个时间点只能干一件事。我们一个程序执行的时候CPU先执行,然后进行IO(数据读取和写出),在IO期间,CPU是不做任何事的,IO完成后然后进行下一次CPU运行计算,整体的时间上会有一些浪费。

多线程并发

CPU开始运行,当遇到IO操作,它会切换到另一个task进行执行,当IO完成了以后,CPU会进行下一部的处理。

CPU和IO是这两个是可以同时并行进行的,IO执行时,是不需要CPU参与的,所以可以把CPU释放出来,执行其他task,从而实现并发加速,但是在原理上还是在一个CPU上运行的。 

多CPU并行

当下我们使用的电脑都是多核CPU,我们可以实现多个CPU多条线执行。

多机器并行

当前大数据时代,很多程序的运行都可以用很多的机器并行来进行运算,每个机器上有很多CPU,每个CPU上也可以进行并发的执行。

3.Python对并发编程的支持

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

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

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

使用Lock对资源加锁,防止冲突访问。

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

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

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

4.什么是CPU密集型运算、IO密集型运算

CPU密集型(CPU-bound):

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

例如:压缩解压缩、加密解密、、正则表达式搜索

IO密集型(I/O bound):

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

例如:文件处理程序、网络爬虫程序、读写数据库程序 

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

 多进程 Process(multiprocessing)

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

缺点:占用资源多、可启用数目比线程少(因为受到CPU的数量限制)

适用于:CPU密集型运算

多线程 Tread(Threading)

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

缺点:1.相比进程:多线程只能并发执行,不能利用多CPU(GIL)

           2.相比协程:启动数目有限制、占用内存资源,有线程切换开销

适用于:IO密集型计算、同时运行的任务数目要求不多 

 多协程 Coroutine(asyncio)

优点:内存开销最少、启动协程数量最多

缺点:支持的库有限(aiohttp VS requests)、代码实现复杂

适用于:IO密集型计算、需要超多任务运行、但有现成库支持的场景

6.怎样根据任务选择对应的技术 

7.GIL是什么?为什么有这个东西?怎样规避GIL带来的麻烦

 在说GIL之前我们提一嘴为什么python的速度慢

1.python是动态类型语言,动态类型语言边解释便执行

2.GIL,无法利用多核CPU并发执行

GIL是什么

全局解释器锁(英语:Global Interpreter Lock,缩写GIL)

是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。即便在多核心处理器上,使用GIL的解释器也只允许同一时间执行一个线程。

 在执行过程中,Thread1遇到I/O会释放这个锁,Thread2会获得这个锁,同理Thread2和Thread3,所以虽是多线程,但是在同一时间只有一个线程在运行。由于GIL的存在,即使电脑有多核CPU,单个时刻也只能使用一个,因此相比并发加速的C++和java所以慢。

 为什么有GIL这个东西

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

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

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

开始:线程A和线程B都引用了对象obj,obj.ref_num=2,线程A和B都想撤销对obj的引用

怎样规避GIL带来的限制

 1.多线程threading机制依然是有用的,用于IO密集型计算

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

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

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

2.使用multiprocessing的多进程机制实现并行计算、利用多核CPU优势。

此文章主要用于总结,截图均来自该链接视频 

Python并发编程简介_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值