进程、线程、协程

一、多任务:

在同一时间内执行多个任务.

并发:多任务在同一段时间内切换执行,基于时间片进行任务切换.

并行:在同一时刻,多个任务同时在执行,基于多个cpu的同时运行.

二、线程:

在程序运行过程中,程序中执行的一个分支,每个运行的程序至少有一个线程,即主线程.

多个子线程的执行顺序是无序的.

创建一个子线程:

多线程之间修改同一数据需要保持同步,称为线程同步,可以使用线程互斥锁实现.

主线程会等待所有子线程运行结束后才结束.

但是如果一个程序中只剩下daemon线程,则所有线程就会退出,就是说如果其他的线程都走完了,daemon线程最后没有走完,它也要随即结束.(这个和java中的类似)

自定义线程类:

三、进程:

通俗的说法,一个运行的程序或者软件,进程是操作系统资源分配的基本单位,每个进程都拥有自己的地址空间、内存等资源.

在一个程序中,默认创建一个进程,该进程中会默认创建一个线程.

线程的出现是由于进程切换时需要耗费大量的资源而发明的产物,它是操作系统执行调度程序的基本单位.

进程的三个状态:

1、就绪:运行的状态都已经具备了,就等着cpu执行(等待获取操作系统分配的时间片),若获取到时间片则进入运行状态;

2、运行:已分配到时间片,运行一段时间后,如果时间片结束则返回就绪状态,如果执行了阻塞任务(sleep等),则进入等待状态;

3、等待:等待着某些条件的满足,或某些任务完成,一旦满足了条件或完成了任务则进入就绪状态.

创建一个子进程:

主进程默认会等待所有子进程退出以后再退出.

两个进程之间不共享其内部的资源.

进程间的通信:

由于两个进程之间默认无法共享各自的内部资源,那么如果需要资源共享,如何实现?

Queue:一种专门用于进程间通信的队列,遵循先进先出.

Queue的使用:

进程池:

由一个控制进程与被控制进程统筹调度的一批准备好的进程组成.

采用进程池的方式可以节约大量的进程创建与销毁的资源开销.

实现一个进程池:

四、协程:

在单线程的基础上执行多任务的一种编码方式,由开发者实现,而不是像线程和进程一样由操作系统实现.

通过gevent实现协程:

注意:使用gevent,可以获得极高的并发性能,但gevent只能在Unix/Linux下运行,在Windows下不保证正常安装和运行.

线程、进程、协程的区别:

1、进程是资源分配的基本单位,线程是操作系统调度的基本单位,而协程的任务调度可以通过开发者控制;

2、进程切换时需要耗费大量资源,效率很低。线程次之。协程切换任务是消耗的资源很少,效率也高;

3、在多核cpu的计算机中,多进程与多线程可能是并行的,而协程基于线程,因此是并发的;

4、在python的多任务中,最好的方式是采用多进程+协程的方式实现,因为那个GIL锁的问题限制了python发挥多线程发的实力(可以查看那篇关于GIL锁的文章)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200218A0TBA400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券