一文看懂进程、线程和协程

要聊明白进程、线程和协程,必须先搞明白两种计算模式
1)CPU密集型计算
2)IO密集型计算

CPU密集型计算的特征是CPU的占用率非常高,因为这一类程序运行过程中,CPU需要进行大量的计算和处理。比如压缩解压缩,加密解密,正则匹配等。

IO密集型计算的特征则是CPU的占用率较低,但程序运行过程中会进行大量的IO读写操作。比如文件处理、网络爬虫、数据库读写等。

明白了CPU密集型操作和IO密集型操作的意思,我们就可以来探讨一下进程、线程和协程了。

进程就是应用的执行副本,一个程序/应用跑起来,就是一个进程。

进程的执行需要CPU资源,需要内存,需要文件资源……总之进程是一个很大的结构体,可以被看做一个资源管理单位。
一个进程可以包含多个线程,每一个进程都至少包含一个主线程。 线程是程序的执行单位,也会占用一些CPU资源。

对于操作系统来说,进程和线程完全可以存储在两张分离的表中,两张表可以通过id关联,但关联实际上并不强。

在操作系统中,进程是向操作系统申请资源的最小单位,应用启动之后就变成进程,这个进程会先拿到一个主线程,这个主线程再向操作系统去申请线程。
线程排队等待被执行,cpu负责调度,每一个线程都被分配一个少量的时间片段,这个线程执行完毕后就切入下一个线程去执行。

操作系统真正调度的是它自己的线程(Kernel Thread),只有Kernel Thread才是real thread,操作系统和应用的线程之间有一个映射,可以是一对一,一对多,或者n对m的关系。
线程的切换仍然是有成本的,尤其在高并发的场景下,这个切换成本也很可观,为了进一步提高线程的利用率,才有了协程(Routine)的概念。

说完了这些,再谈一谈python的多进程、多线程和多协程

Python中:
多进程对应的模块是multiprocessing, 优点是可以利用多核cpu资源,并行运算。 适合cpu密集型计算。
多线程对应的模块是threading,只能并发执行,不能利用多cpu(GIL锁)。适合IO密集型计算,同时运行的任务数目不要太多。
多协程对应的模块是asyncio,内存开销最少,启动协程数量最多,但支持的库有限,代码实现复杂。适合IO密集型计算,需要超多任务运行,且有现成库支持的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值