【Python】并发编程

目录

为什么要引入并发编程?

python对并发编程的支持

如何选择呢?


为什么要引入并发编程?

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

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

为了提升程序运行速度

单线程串行:

线程开始以后,cpu先执行,然后进行io(数据读取和写出),在io期间cpu是不做任何事情的,io完成以后,cpu继续开始运算,进行下一次io,因为在io的时候,cpu是等待状态,造成浪费。

多线程并发:

cpu开始执行,如果遇到了io操作,它会切换到另一个task进行执行,当io完成了以后,会通知cpu进行下一步的处理。(cpu和io是可以同时并发进行的,io的执行,比如读取内存、磁盘、网络,它的过程中是不需要cpu的参与的,这样的话cpu可以释放出来来执行其他task,实现并发的加速)但是其实这种原理上,还是一个cpu来进行运行的。

多cpu并行:

当前我们的电脑都是多核cpu。可以实现多个cpu多条线,同时真正的并行执行进行加速,这是一个并行的编程。

多机器并行:

再提升一步,进入了大数据时代,很多程序的运行都可以用很多的机器并行来进行运算,每个机器上有很多cpu,每个cpu上也可以进行并发的执行,这就是程序提速运行的几种粒度。

以上就是单线程、多线程、多cpu和多机器。

python对并发编程的支持

如何选择呢?

python并发编程有三种方式:

多线程Thread、多进程process、多协程Coroutine

分为一下几个部分进行讲解

cpu-bound:cpu是运行的瓶颈

简而言之,如果你的程序依赖大量的外部数据源,比如说内存磁盘和网络,那么他就是io密集型了;否则如果只在cpu中进行计算,那就是cpu密集。

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

多进程受到cpu数量限制,适用于读取了数据,需要在cpu上运行大量的次数和时间;

线程占用资源少是指:每一个线程的运行都要包含自己的一些变量的存储,存储到内存区域,这是线程本身要消耗内存的。

在python中,多线程只能同时使用一个cpu,这是Python多线程的一个非常大的缺点,但是多线程也能用于io密集型的计算,因为cpu和io是可以并行进行的。 这个缺点主要是相比与进程的,就是它只能同时使用单个cpu。

协程可以开几万个;

 

如何选择?

 

超多任务量是指?