【Python程序开发系列】进程、线程、协程?一文全面梳理多任务并发编程基本概念
这是Python程序开发原创文章,我的第185篇原创文章。
一、多任务
? ? ??多任务是指在同一时间内执行多个任务。例如: 现在电脑安装的操作系统都是多任务操作系统,你可以同时运行着多个软件,一边用浏览器上网,一边在听MP3,一边在用Word赶作业。在代码里面,一个程序函数或方法就是一个任务,平时我们写的程序几乎都是单任务的,也就是说一个函数或者方法执行完成 , 另外一个函数或者方法才能执行。多任务就是多个程序函数或方法同时执行。
????????多任务分为以下两种:
????????计算密集型任务:这类任务主要占用cpu资源又叫cpu密集型任务。主要特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等。这种任务虽然也可以用多任务完成,但是当任务过多时(超过cpu的核数),花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。
????????IO密集型任务:涉及到网络、磁盘IO的任务都是IO密集型任务,比如网络传输、数据库等调用、爬虫等,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(存在阻塞),99%的时间花费在IO上(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务。
二、多任务的两种表现形式:并行和并发
????????并行处理是指计算机系统中能同时执行两个或多个任务的计算方法,并行处理可同时工作于同一程序的不同方面。
????????并发处理是同一时间段内有几个程序都在一个cpu中处于运行状态,但任一时刻只有一个程序在cpu上运行。
????????并发的重点在于有处理多个任务的能力,不一定要同时,交替执行(伪并行);而并行的重点在于就是有同时处理多个任务的能力。并行是并发的子集。
????????以上所说的是相对于所有语言来说的,Python的特殊之处在于Python有一把GIL锁,这把锁限制了同一时间内一个进程只能有一个线程能使用cpu。
三、多任务的实现方式:并发编程
????????并发编程是实现多任务协同处理,改善系统性能的方式。Python中实现并发编程主要依靠一下三种方式:
进程(Process):进程是计算机中的程序关于某数据集合的一次运行实例,是操作系统进行资源分配的最小单位,是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。例如:正在运行的qq , 微信等 他们都是一个进程。一个程序运行后至少有一个进程。
线程(Thread):线程被包含在进程之中,是操作系统进行程序调度执行的最小单位。实际上进程只负责分配资源 , 而利用这些资源执行程序的是线程 , 也就说进程是线程的容器 ,?一个进程中最少有一个线程来负责执行程序?。同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源 。这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样 , 实现多任务的同时也节省了资源。具体行为是由内核操作的,什么时候运行什么部分,这个部分运行多长时间,都不受用户控制。
协程(Coroutine):协程是在程序层面操作的,可以控制遇到阻塞的时候候程序该干什么,是用户态执行的轻量级编程模型,由单一线程内部发出控制信号进行调度,而非受到操作系统管理。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
????????一个进程可以包含多个线程,一个线程可以包含多个协程。一个进程中最少有一个线程来负责执行程序,GIL锁限制了同一时间内一个进程只能有一个线程能使用cpu,因此python中的多线程不能真正同时运行,更适合处理 I/O 密集的场景。而相较于线程,协程没有切换开销和同步锁机制,处理 I/O 密集任务更优。
????????协程和线程更适合处理 I/O 密集的场景;而对于 CPU 密集的场景来说,多进程、多机器、多处理器才能提高程序的运行速度。
四、并发(编程)与异步(编程)
????????并发强调同时(交替同时)执行多个任务的能力和机制,并发编程是指在同一时间段内执行多个任务,这些任务可以是同时执行的(并行),也可以是交替执行的(并发),一般可以通过多线程、多进程来实现。并发编程狭义上指通过多进程和多线程方式实现多任务,广义上包括异步编程,也就是协程。
????????异步强调多个任务执行的顺序,指的是一个任务的完成不会阻塞其他任务的执行。异步编程是一种编程模型(即协程),它允许在等待某个操作完成的同时执行其他任务,而不会阻塞程序的执行。通常使用回调、协程、事件循环等机制来实现,它可以在等待 I/O 操作、计算任务等时释放 CPU 的控制权,执行其他任务。异步编程通常是并发编程的一种实现方式,通过异步操作可以实现并发执行多个任务的效果。
本期内容就到这里,我们下期再见!需要数据集和源码的小伙伴关注底部公众号添加作者微信!
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!