前言
相信大家在刚开始接触三程的时候会懵逼,进程和线程是操作系统的基本概念,但是他们比较抽象,不容易掌握。今天来细细的解释一下进程和线程,关于协程之后有时间会独自出一篇。
多进程
在谈到进程的时候,大家总说的一句话就是,进程是操作系统分配资源的最小单位,这句话理论上没有什么问题,但是对新手不友好。
首先我们一点点的说,从什么是进程开始吧
进程呢,就是一个将一个程序放入到内存中,从CPU和内存中申请进程资源,从而运行起来,这个运行起来的程序,就是进程,举个例子,进程就好像一座超市,而CPU呢,就好像给超市供电的发电站,假设发电站电力有限,只能供给一座超市,当一个超市正常运行时,其他的超市就得停,就是说,单个CPU只能一次执行一个任务。而一个CPU想要执行多个进程,就需要时间片轮询,什么意思呢,系统会分给每个进程一个时间片,在这个时间片内,是轮到这个进程执行的,然后多个进程轮流执行,由于轮的很快,人的肉眼根本分辨不出来,所以,他们看起来是一起执行的,但是实际上,同一时间只有一个进程在执行。这也就是我们常说的并发,同一时间点,只有一个进程在运行,他们只是因为快速的切换达到多任务的效果
每家超市的货物库存都是独立的,也就是说,每个进程的资源不是共享的。
多线程
线程是系统调度的最小单位,他运行在进程中,就拿上边的例子来举例,每个超市中的收银台,就好像一个个的线程,每个线程都是共享进程的资源的。
并且,他们是一起执行的,并不是轮流执行,这也就是所谓的并行。
谈到线程,就不得不说子线程,子线程就好像超市排队结账的人,他们都是要通过主线程。
如果你没有对线程进行阻塞,就会造成,你排着排着队,超市下班点到了,所有人都走了,你排队的人一脸懵逼,这时候,就需要守护线程登场,在主线程要结束的时候,先看看超市中还有没有人,等到没人了,主线程才结束。
由于系统中,线程的启动成本是比较高的,因为他涉及到与操作系统的交互,在这种情况下,使用线程池可以很好的提升性能,在系统启动时创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它,当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。
此外,使用线程池可以有效的控制系统中并发线程的数量,当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至可能会导致python解释器崩溃。
还有一点是,线程的执行是有顺序的,但是,它可以被其他线程抢占,当多个线程对同一个数据做修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对资源加锁。
补充,python解释器默认是Cpython
,它上面有一个全局解释器锁GIL,它的作用是,限制多线程同时执行,保证同一时间内只有一个线程在执行,GIL并不是python的特性,注意,python和python解释器是两个概念。
所以python也被人诟病是伪多线程,而解决这个问题,可以使用协程或者多进程,也可以换其他解释器,比如PyPy
。
- Post link: https://www.godhearing.cn/qian-tan-jin-cheng-he-xian-cheng/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.