天天看点

一些概念:同步、异步、协程同步异步

同步

同步:指的一些处理流程在某一时刻/时段内进行顺序执行。常见的有线程的同步,这里的同步是对于线程来说的,因为他们会去访问修改同一部分资源,线程之间在某个时间段内是可以交叉执行,这就有可能造成数据数据混乱,所以这里了就是需要进行同步的操作,要进行顺序执行。可以理解为排队(访问修改)共享资源,以达到顺序的目的,这样一条队伍(现实中的队伍)中的各个线程(军训中的人)也就是步调一致了,同步也就是这么来了的。

扩展到网络应用中,对于开启的单进行单线程 ' tornado的服务 ',每一个时刻只能处理一个请求,而其他请求就要类似于排队等待的,也就是同步的进行。假如单个请求处理时间过长,队伍中的其他所有请求就会需要等待更多时间,这是网络应用中所不希望的,也就是长时间的处理流程不需要同步,要异步进行,如下。

异步

异步:指的是 在同一时刻/时间段,一些处理流程是并发执行 (并行,同一时刻发生。并发,同一时间段发生),也就是一个时间段内可以处理多个流程。这些流程并不一定是顺序进行的(指在这一时间段内),而是存在交叉的的执行的,也就是说一个流程在没处理完的时候,可以去处理另外一个流程,流程间的步调是不一致的,也就是不同步,所以就是异步的。

一些自带同步、异步特性的东西:

线程/进程: 在线程之间或进程之间,默认就是异步的,也就是在一个时间段内,可以有多个线程或是进程执行,这是操作系统赋予的能力。

线程内的程序片段:一些线程内的代码片段 默认就是顺序执行的,也就是某一时间段内只能执行某一个代码片,更大的时间段内的多个代码片是顺序执行的,也就是默认的同步。

一些问题:正如上面所讲,一些具体的应用中,上面的默认设定并不能满足玩家的需求!例如:想要多线程处理某些工作,但是在某些地方并不想异步处理。想要提高并发数量,但是呢在某一个时间段内并不想仅仅只处理一个流程。

所以一些人就开始寻求各种方式进行改变!,所以也就有了一些经典的问题!例如:线程的同步,网络应用中的异步操作等,下面会进行一些说明。

线程的同步: 如果是想限制 某一个时间片内(处理流程操作时间)(共享位置) 只能 有有限个处理流程进行处理,,理想的操作时,如果是限制数量是一个的话,就是用锁,如果限制数量是多个的话就使用信号量。要占用这段时间片/共享位置 的话需要申请 锁 或信号量,这样就能限制了同时访问的数量,如果是一个的话,就是同步的了。

网络应用中的异步(并发的实现):通常有些会默认使用系统提供的并发能力,如上所说,开多个进程,多个进程中开多个线程,以此提高并发能力。然而操作系统资源毕竟有限,一般只是一个线程内部只能处理一个流程。如果处理的慢,效果看起来并不理想,所以一些人就想在线程内,模拟操作系统的一些做法,在线程内的处理流程中进行中断执行(中断的位置通常是IO的位置),去执行其他操作,以此达到多流程交叉执行的目标,因此就出现了协程的概念,也就是一个线程内的多个程序片段 同时(并发)执行(cpu 还是一个刻只能处理一个流程的)。

协程:上面已经对其有了描述,这里要说的是协程 其本质就是将线程内的同步程序进行再次分割,以此达到更小粒度提高并发,提高cpu 的利用率或是网络中的并发量。这里的分割,也就是同步程序执行的中断。下面会有一些例子进行更好的理解:

这里要有python 的协程的实现,或是一些 库的使用。

异步,并发:其本质就是将一些I/O (网络IO、磁盘IO)所用的时间进行重叠,以到达 同一时间段内处理多个任务(这里CPU处理的真正的时间很短 ,忽略。多个任务处理,即使是并发,总时间也是多于单个任务处理的,这里是近似相等),

继续阅读