Python-异步编程,,1、异步 同步  函


1、异步 同步

  函数或方法被调用时,调用者是否得到最终的结果

  直接得到最终结果的,就是同步调用

  不直接得到最终结果的,就是异步调用

2、阻塞 非阻塞

  函数或方法调用的时候,是否立刻返回

  立即返回就是非阻塞

  不立即返回就是阻塞调用

3、区别

  同步,异步,与 阻塞,非阻塞 没有关系

  同步,异步强调的是,是否得到最终的结果。

  阻塞,非阻塞强调的是时间,是否等待

  同步与异步区别在于:调用者是否得到了想要的结果

  同步就是一直要执行到返回最终的结果

  异步就是直接返回额,但是返回的不是最终的结果,调用者不能通过这种嗲用得到结果,需要童工被调用者的其他方式通知调用者,来取回最终结果。

  阻塞与非阻塞 的区别在于,调用者是否还能干其他的事

  阻塞,调用者就只能干等

  非阻塞,调用者可以先去忙别的,不用一直等。

4、联系

  同步阻塞:什么都不做,直到拿到最终的结果

  同步非阻塞:等最终结果的期间,可以做别的

  异步阻塞:给一个信息,让等通知,但是期间什么都不干

  异步非阻塞:等通知,但是期间可以做别的

5、同步IO,异步IO,IO 多路复用

  5.1、IO 两个阶段:

    1、数据准备阶段

    2、内核空间复制数据到用户进程缓冲区阶段

  5.2、发生IO的时候:

    1、内核从输入设备读,写数据

    2、进程从内核复制数据

  系统调用 ---- read 函数

6、IO 模型

  同步IO:

    同步IO 模型包括:阻塞IO,非阻塞IO, IO多路复用

  ***阻塞IO:

技术分享图片技术分享图片

  进程等待(阻塞),知道读写完成(全程等待)

  read/ write 函数

  ****非阻塞IO

  技术分享图片

  技术分享图片

  进程调用read操作,如果IO设备没有准备好,立即返回error ,进程不阻塞,用户可以再次发起系统调用,如果内核已经准备好,就阻塞,然后复制数据到用户空间。

  第一阶段数据没有准备好,就先忙别的,等会再来看看,检查数据是否准备好了的过程是非阻塞的。

  第二阶段是阻塞的,即内核空间和用户空间之间复制数据 是阻塞的。

  ****IO 多路复用 

    所谓IO 多路复用,就是同事监控多个IO,有一个准备好了,就不需要等了,开始处理,提高了同时处理IO 的能力

    select 几乎所有的操作系统平台都支持,poll是对select的升级

    epoll,Linux系统内核2.5+开始支持,对select和poll的增强,在监视的基础上,增加了回调机制,BSD,Mac平台有kqueque,windows有iocp

  技术分享图片

  技术分享图片  

  select 为例,将关注的IO 操作 告诉select函数 并调用,进程阻塞,内核监视select关注的文件描述符fd,被关注的任何一个fd对应的IO准备好了数据,select 返回,在使用read将数据复制到用户进程。

  一般情况下,select最多能监听1024个fd(可以修改,不建议修改),但是由于select 采用轮询的方式,当管理的IO 多了,每次都要遍历全部额fd,效率低下(每次某个IO 设备准备好了,都需要遍历一遍select)

  基于事件驱动的epoll没有管理的fd的上限, 且是回调机制,不需要遍历,效率很高。

      事件驱动IO:                通知机制:                    1、水平触发通知,一直通知,直到处理                    2、边缘触发, 只通知一次                event 是事件驱动IO

  异步IO:

   技术分享图片

  进程发起异步IO 请求,立即返回,内核完成 IO 的两个阶段,内核给进程发一个信号

  技术分享图片

7、Python中 IO 多路 复用

  IO 多路复用:

大多数操作系统都支持select 和pollLinux 2.5+ 支持epollBSD,Mac 支持kquequewindoes的iocp

  Python的select库

    实现了select , poll 系统调用,这个基本上操作系统都支持,部分实现了epoll

    底层的IO 多路复用模块。

  开发中的选择:

    1、完全夸平台,使用select ,poll,但是性能较差

    2、针对不同操作系统自行选择支持的技术,

    select 维护一个文件描述符数据结构,单个进程使用有上限,通常1024,线性扫描这个数据结构,效率低,

    poll和select的区别是内部数据结构使用链表,没有这个最大限制,但是依然是线性遍历才能知道那个设备就绪了

    epoll使用事件通知机制,使用回调机制提高效率

    select poll 还要从内核空间复制消息到用户空间,而epoll通过内核空间 和用户空间共享的一块内存来减少复制(mmap))

Python-异步编程

评论关闭