1. 主页
  2. Python基础到高级
  3. 异步编程
  4. 基本概述

基本概述

基本概念

在说异步编程之前,首先来说说,同步/异步、阻塞/非阻塞、同步IO/异步IO/IO多路复用之间的基本概述, 大多是本人整理编写,或在网络中收集。

同步/异步

同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。

异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。

同步,就是实时处理(如打电话),比如服务器一接收客户端请求,马上响应,这样客户端可以在最短的时间内得到结果,但是如果多个客户端,或者一个客户端发出的请求很频繁,服务器无法同步处理,就会造成涌塞。

同步如打电话,通信双方不能断(我们是同时进行,同步),你一句我一句,这样的好处是,对方想表达的信息我马上能收到,但是,我在打着电话,我无法做别的事情。

异步,就是分时处理(如收发短信),服务器接收到客户端请求后并不是立即处理,而是等待服务器比较空闲的时候加以处理,可以避免涌塞。

异步如收发收短信,对比打电话,打电话我一定要在电话的旁边听着,保证双方都在线,而收发短信,对方不用保证此刻我一定在手机旁,同时,我也不用时刻留意手机有没有来短信。这样的话,我看着视频,然后来了短信,我就处理短信(也可以不处理),接着再看视频。

对于写程序,同步往往会阻塞,没有数据过来,我就等着,异步则不会阻塞,没数据来我干别的事,有数据来去处理这些数据。

同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行(死心眼)。

异步在一定程度上可以看做是多线程的(废话,一个线程怎么叫异步),请求一个方法后,就不管了,继续执行其他的方法。

阻塞/非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

例如:你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

同步IO/异步IO/IO多路复用

发生IO的时候:

  1. 内核从输入设备读写数据
  2. 进程从内核复制数据
  • 同步IO:
    • 阻塞IO:进程等待,直到读写完成 read/write
    • 非阻塞IO:进程不等待,如果IO设备么有准备好,返回ERROR,此外,内核和用户空间之间复制数据是阻塞的 read/write
    • IO多路复用:阻塞的,直到其中一个IO设备准备好,IO多路复用的几种机制 select/poll/epoll/

select(),poll(),epoll()都是I/O多路复用的机制。

I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作。

但select(),poll(),epoll()本质上都是同步I/O

因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的

而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间

本文多数为自己整理,也有从网上收集的资源,如有侵权,请告知我删除。

我们要如何帮助您?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注