1 并发、并行、同步、异步、阻塞、非阻塞

并发、并行

并发是报一个时间段内有几个程序在同一个cpu上运行,但是任意时刻只有一个程序在cpu上运行。在一个时间段内某一个请求很快,能够响应的用户就越多,高并发。

并行是指任意时刻点上,有多个程序同时运行在多个cpu上,并行数量跟CPU数一致的,因此没有高并行。

情况:开水没有:水壶要洗,茶壶茶杯要洗:火生了,茶叶也有了。怎么办?
时间分配:
洗水壶:
灌凉水:
洗茶壶:
洗茶杯:
拿茶叶:
泡茶:
烧开水:
并发版
老张
办法甲:洗好水壶,灌上凉水,放在火上;在等待水开的时间里,洗茶壶、洗茶杯、拿茶叶;等水开了,泡茶喝。
总用时:+++=
办法乙:先做好一些准备工作,洗水壶,洗茶壶茶杯,拿茶叶;一切就绪,灌水烧水;坐待水开了泡茶喝。
总用时:+++++=
办法丙:洗净水壶,灌上凉水,放在火上,坐待水开;水开了之后,急急忙忙找茶叶,洗茶壶茶杯,泡茶喝。
总用时:+++++=
并行版
老张:洗好水壶,灌上凉水,放在火上
老李:洗茶壶
老谢:洗茶杯

问题-喝茶

同步、异步

同步是指代码调用IO操作时,必须等待IO操作完成才返回的调用方式。
异步是指代码调用IO操作时,不必等IO操作完成就返回的调用方式。

消息通信 的一种机制

阻塞、非阻塞

阻塞是指调用函数时候当前线程被挂起。
阻塞是指调用函数时候当前线程不会被挂起,而是立即返回。

是函数调用的一种机制

2 IO 多路复用 (select、poll 和 epoll)

C10K问题

C10k是一个在1999年被提出来的技术挑战
如何在一颗 1GHz CPU,2G内存,1gbps网络环境下,让单台服务器同时
为1万个客户端提供FTP服务

多用户连接,多线程一个线程只能处理一个socket,不能处理上万用户,因为不可能开启上万线程。

Unix下五种I/O模型

阻塞式I/O
非阻塞式I/O
I/O复用
信号驱动式I/O(使用较少)
异步I/O(POSIX的aio系列函数)

阻塞式I/O

recvfrom 会一直阻塞,直到返回数据

client.setblocking(False) #socket 中设置非阻塞
client.connect((host,80))

非阻塞式I/O

没有数据准备好就立马返回

如果下一行代码,依赖上一句(connect的建立)完成,就需要不断的while循环去检查状态(是耗cpu的),时间和同步差不多。

如果下一行代码,不依赖上一句代码的执行完成,如做计算任务或者再次发起其他的连接请求,非阻塞IO就很有用

将数据从内核复制到用户空间

I/O复用

I/O多路复用,很多框架用的

select 也是阻塞的,可以同时监听多个文件句柄 socket 状态。一旦有一个发生变化,就处理它,没有去轮询。 但 recvfrom 复制数据报,将数据从内核复制到用户空间时仍需要耗费时间。

信号驱动式IO

用的比较少

异步IO

真正意义上的异步IO,

数据准备好了才发信号处理,省略了将数据从内核复制到用户空间的等待时间,编程难度较大。对比io多路复用,性能提高不明显

select、poll、epoll

select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程(将数据从内核复制到用户空间)是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

select

select函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以通过遍历fdset,来找到就绪的描述符。
select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。

poll

不同与select使用三个位图来表示三个fdset的方式,poll使用一个pollfd的指针实现。
pollfd 结构包含了要监视的event和发生的event,不再使用select“参数-值”传递的方式。同时,pollfd并没有最大数量限制(但是数量过大后性能也是会下降)。和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。
  从上面看,select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降

epoll

epol是在linux 2.6内核中提出的,是之前的 select 和 poll 的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。  (nginx)

查询利用了:红黑树

并不代表 epoll 比 select 一定好

# 1. epoll 并不代表一定比 select 好
# 在并发高的情况下,连接活跃度不是很高, epoll 比 select
# 并发性不高,同时连接很活跃, select 比 epoll好

gj12-1 协程和异步io的更多相关文章

  1. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  2. Python-09-线程、进程、协程、异步IO

    0. 什么是线程(thread)? 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆 ...

  3. 协程、异步IO

    协程,又称微线程,纤程.英文名Coroutine,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器 ...

  4. python 自动化之路 day 10 协程、异步IO、队列、缓存

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...

  5. Python【第十篇】协程、异步IO

    大纲 Gevent协程 阻塞IO和非阻塞IO.同步IO和异步IO的区别 事件驱动.IO多路复用(select/poll/epoll) 1.协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coro ...

  6. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  7. Python开发【第九篇】:协程、异步IO

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回 ...

  8. 协程和异步io

    一. 并发.并行.同步.异步.阻塞.非阻塞 1.并发:是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机上运 ...

  9. Python 10 协程,异步IO,Paramiko

    本节内容 Gevent协程 异步IO Paramiko 携程 协程,又称为微线程,纤程(coroutine).是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文 ...

  10. Python协程、异步IO

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

随机推荐

  1. nginx 限制ip

    转自:https://www.cmsky.com/nginx-deny-ip/ 面对垃圾留言和暴力破解,我们可以封禁IP,前文介绍过Apache环境使用.htacess来屏蔽IP,Nginx也可以做到 ...

  2. vscode 习惯配置

    { "gitlens.advanced.messages": { "suppressShowKeyBindingsNotice": true }, " ...

  3. 不影响Inspector布局拓展类

    DecoratorEditor.cs using System.Collections.Generic; using System.Linq; using System.Reflection; usi ...

  4. MVC3 发布到IIS 7.5

    1.应用程序池采用集成模式(建议),.NET Framework版本为: .NET Framework4.0.30319. 2.确保ASP.NET MVC3已安装好,然后检查站点的处理程序映射,看是否 ...

  5. MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能

    各班级学生成绩测试表 select * from TMP_A; 实现目的: 按照班级分类后按照分数倒序排序 采用MySQL变量简单实现,SQL如下: SELECT  a.stu_id,a.point, ...

  6. 八大排序算法python实现

    一.概述   排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当 ...

  7. 关于sql 增删改

    1.更改数据库的名称 --更改数据库的名称,逗号前面是之前的,后面是改成的名 sp_renamedb student,xuesheng 2.表中有数据的情况下再添加列.删除列 --后来添加列,只能默认 ...

  8. python中使用Opencv进行人脸识别

    上一节讲到人脸检测,现在讲一下人脸识别.具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别. 人脸识别前所需要的人脸库可以通过两种方式获得:1.自己从视频获取图像   2.从人 ...

  9. Linux查看内存使用情况

    输入:top PID:进程的ID USER:进程所有 PR:进程的优先级别,越小越优先被执 NInice: VIRT:进程占用的虚拟内 RES:进程占用的物理内 SHR:进程使用的共享内 S:进程的状 ...

  10. 读《asp.net MVC4开发指南(黄保翕编著)》笔记

    在刚刚过去的中秋节中,利用了两天的碎片时间把黄保翕编著的<asp.net MVC4 开发指南>看了遍,笔记如下,欢饮在开发MVC的同学一起来探讨: 1.社区 2.开源程序 3.易测试性 4 ...