异步io

从网络IO看高性能框架

China☆狼群 提交于 2020-02-01 18:52:46
前言: 我是一名golang后端开发工程师,不是Java,也不是拍黄片,对,就是那个号称原生支持高并发的“够浪!”。那为什么go能支持高并发?原生支持高并发又是何解?跟着我,一起探讨一下所谓的高并发是怎么回事… 阅读本文你将收获: 知道框架高性能的根本原因 了解进程,线程切换开销在哪里 熟悉阻塞与非阻塞IO,同步与异步调用的区别 大纲: 讨论一个高性能框架甚至语言的时候,我们在讨论什么? 三大网络模型 阻塞IO+多进程 阻塞IO+多线程 非阻塞IO+IO多路复用 五种网络IO简介 网络IO的本质 如何区分阻塞IO和非阻塞IO 如何区分同步和异步 个人整理的网络IO思维导图 1.讨论一个高性能框架甚至语言的时候,我们在讨论什么 我相信大家肯定听过什么阻塞/非阻塞IO,同步/异步调用,我也尝试过死记概念,结果大家应该都有体会,过一阵子就忘记了。知其然而不知其所以然~然并卵。 大家在选择一门语言或者一个框架的时候肯定优先看他的性能,也就是并发量,例如常用的测试手段,就是用该语言或者框架写个http server服务器,对于http请求返回一个“hello,world!”,利用wrk进行压测,看看每分钟请求量最高能到多少,在4核8G的Ubuntu服务器上跑该http服务,利用wrk压测,gin框架每分钟能处理的请求量接近300W!这是相当优秀的! 前一阵子在go meet

python学习笔记——异步IO

南楼画角 提交于 2020-01-31 17:36:12
异步IO 对于异步IO阻塞非阻塞,我觉得下面的例子更简单易懂。 老张爱喝茶,废话不说,煮开水。 出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1 老张把水壶放到火上,立等水开。(同步阻塞) 老张觉得自己有点傻 2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞) 老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。 3 老张把响水壶放到火上,立等水开。(异步阻塞) 老张觉得这样傻等意义不大 4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞) 老张觉得自己聪明了。 所谓同步异步,只是对于水壶而言。 普通水壶,同步;响水壶,异步。 虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。 同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。 所谓阻塞非阻塞,仅仅对于老张而言。 立等的老张,阻塞;看电视的老张,非阻塞。 情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。 生成器进阶 关于yield和yield from def generator_1(titles): yield titles def

EventLoop

空扰寡人 提交于 2020-01-29 16:12:36
文章资料来自 Node.js 事件循环机制 JS灵魂之问(下) EventLoop的中国名字叫事件循环,这个玩意真的是高深莫测,一般开发都用不到,代码只管写就行,虽然不用懂,但是面试就是要问,这对我这种小菜鸡真是满满的恶意 先说说异步IO 这个在Linux笔记里有,但是异步IO只有 Linux 下存在,在其他系统中没有异步 IO 支持,那window的异步IO是怎么实现的,==利用多线程==,我们可以让一个进程进行计算操作,另外一些进行 IO 调用,IO 完成后把信号传给计算的线程,进而执行回调,这不就好了吗?没错,异步 IO 就是使用这样的==线程池==来实现的,只不过在不同的系统下面表现会有所差异,在 Linux 下可以直接使用==线程池==来完成,在Window系统下则采用 IOCP 这个系统API(其内部还是用==线程池==完成的) 上面的三个线程池都加粗了,因为他就是关键字,线程池的运行图很常见 V8、事件循环、事件队列都在单线程中运行,最右侧还有工作线程(Worker Thread)负责提供异步的I/O操作,这就是为什么说Node.js拥有非阻塞的,事件驱动的异步IO架构 不仅是异步IO运行在线程池,NodeJS的计时器,http请求,浏览器的计时器,http请求ajax,ui渲染也都是运行在线程池的,也就是说==js是单线程运行是错的==,他是==同步任务单线程运行=

Nginx学习笔记(三)—Nginx的I/O模型详解

☆樱花仙子☆ 提交于 2020-01-29 03:37:47
一、web请求处理机制 1.1 多进程方式 多进程方式: 服务器每接受到一个客户端请求就有服务器的 主进程 生成一个 子进程 响应客户端 ,直到用户关闭连接 优点:处理速度快,子进程之间相互独立 缺点: 访问过多会导致服务器资源耗尽而无法再提供请求 1.2 多线程方式 多线程方式: :与多进程方式类似,但是每收到一个客户端请求会有 服务进程 派生出一个 线程 来和客户方进行交互。 优点: 一个线程的开销远远小于一个进程 ,因此减轻了web服务器对系统资源的要求 缺点:当多个线程位于同一个进程内工作的时候,可以相互访问同一的内存地址空间,所以 线程相互影响 , 一旦主进程挂掉则所有子线程都不能工作 ,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。 1.3 异步 异步的方式:nginx的epoll,apache的event等 二、同步异步,阻塞非阻塞和Nginx的I/O模型 2.1 同步与异步(应用程序与内核的交互方式) 同步: 进程发出数据后,等内核返回响应以后才继续下一个请求,即如果内核一直不返回数据,那么进程就一直等,直到天荒地老,死机error。 异步: 进程发出数据后,不等内核返回响应,接着处理下一个请求,内核通过回调函数来处理进程。Nginx是异步的。 同步和异步关注的是消息通信机制 ,在同步机制中,所有的请求在服务器端得到同步

Netty序章之BIO NIO AIO演变

扶醉桌前 提交于 2020-01-26 08:31:57
netty是什么     Netty是一个基于Java NIO的client-server网络服务框架,人们可以利用netty快速地开发网络应用。同时netty相对于其他网络框架更加简单并且扩展性更强,这主要得益于其提供的简单易用的api将业务逻辑和网络处理代码解耦开来。能够使你更加专注于业务的实现而不需要太多关心网络底层实现。 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发 高性能 、 高可靠 的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。更是面试的加分项。Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。而BIO,NIO,AIO更是笔试中要考,面试中要问的技术。也是一个很好的加分项 流程图: 技术:BIO,NIO,AIO 说明:github上有更全的源码。 源码: https://github.com/ITDragonBl... BIO BIO 全称Block-IO 是一种 阻塞同步 的通信模式。我们常说的Stock IO 一般指的是BIO。是一个比较传统的通信方式, 模式简单 , 使用方便 。但 并发处理能力低 , 通信耗时 , 依赖网速 。 BIO 设计原理: 服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式

python IO模式(多路复用和异步IO深入理解)

我只是一个虾纸丫 提交于 2020-01-26 04:38:13
1、事件渠道模型。事件渠道为异步IO的原型。 2、IO模式,一次IO调用会经历两个阶段。一、等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二、将数据从内核拷贝到进程中。 基于这两个阶段,linux系统下面产生了五种网络网络模式方案。 -阻塞I/O(blocking IO) -非阻塞I/O(nobokcing IO) - I/O多路复用。(I/O multiplexing) - 信号驱动 -异步I/O(async) 由于信号驱动使用较少,主要介绍其余四种模式。 3、阻塞I/O(blocking IO)在数据准备阶段和贝考数据阶段都会阻塞。用户调用recefrom 以后会一直等待数据拷贝到用户内存未至。 2、非阻塞I/O(nobokcing IO),用户会一直调用recefrom,如果数据没有准备好。会返回一个ERROR。一直到数据准备好。因此在读数据阶段不会卡住。 3、epoll模式,也就是IO多路复用模式。一次性可以处理多个网络IO。调用select方法。首先会卡住。直到其中一个有数据就会立即返回。然后拷贝数据。然后进入下一个循环 4、异步IO,异步I/O不会阻塞。当用户进程发起read操作以后。可以立刻开始做其他的事情(相当于告诉在内核注册一个事件。由内核进行监控,处理完以后内核主动通知)。而另一方面从kennel角度看当他收到一个async read以后

Netty序章之BIO NIO AIO演变

喜夏-厌秋 提交于 2020-01-25 03:48:15
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发 高性能 、 高可靠 的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。更是面试的加分项。Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。而BIO,NIO,AIO更是笔试中要考,面试中要问的技术。也是一个很好的加分项,加分就是加工资,你还在等什么?本章带你细细品味三者的不同! 流程图: 技术:BIO,NIO,AIO 说明:github上有更全的源码。 源码:https://github.com/ITDragonBlog/daydayup/tree/master/Netty/socket-io BIO BIO 全称Block-IO 是一种 阻塞同步 的通信模式。我们常说的Stock IO 一般指的是BIO。是一个比较传统的通信方式, 模式简单 , 使用方便 。但 并发处理能力低 , 通信耗时 , 依赖网速 。 BIO 设计原理: 服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。若客户端数量增多,频繁地创建和销毁线程会给服务器打开很大的压力。后改良为用线程池的方式代替新增线程,被称为伪异步IO。 服务器提供IP地址和监听的端口

IO模型——IO多路复用机制

孤街醉人 提交于 2020-01-24 02:49:31
(1)I/O多路复用技术通过把多个I/O的阻塞复用到同一个select、poll或epoll的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程。 (2)select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 (3)I/O多路复用的主要应用场景如下: 服务器 需要同时处理多个处于监听状态或者多个连接状态的套接字; 服务器需要同时处理多种网络协议的套接字; (4)目前支持I/O多路复用的系统调用有 select,poll,epoll,epoll与select的原理比较类似,但epoll作了很多重大改进,现总结如下: ①支持一个进程打开的文件句柄FD个数不受限制(为什么select的句柄数量受限制:select使用位域的方式来传递关心的文件描述符,因为位域就有最大长度,在Linux下是1024,所以有数量限制); ②I/O效率不会随着FD数目的增加而线性下降; ③epoll的API更加简单; 来源: https://www.cnblogs.com/sea-stream/p/10563955.html

C++ 异步IO (一) 阻塞式HTTP客户端

风格不统一 提交于 2020-01-23 18:30:24
An IO call is synchronous if, when you call it, it does not return until the operation is completed, or until enough time has passed that your network stack gives up. 简单来说,IO的函数后面的代码不会被执行,除非IO函数已返回,或函数超时了。 /* For sockaddr_in */ #include <netinet/in.h> /* For socket functions */ #include <sys/socket.h> /* For gethostbyname */ #include <netdb.h> #include <unistd.h> #include <string.h> #include <stdio.h> int main(int c, char **v) { const char query[] = "GET / HTTP/1.0\r\n" "Host: www.baidu.com\r\n" "\r\n"; const char hostname[] = "www.baidu.com"; struct sockaddr_in sin; struct hostent *h; const

记录些等待队列(wait_queue)的使用

时间秒杀一切 提交于 2020-01-23 09:41:34
贴几篇文章先... https://blog.csdn.net/hs794502825/article/details/8959459 https://blog.csdn.net/lizuobin2/article/details/51785812 记录些概念和接口。 1. 什么是睡眠? cpu调度 有 按时间片轮转, 抢占式基于优先级, 实时调度等很多方式。 不同场景使用不同调度方式。 比如Linux就是一个非硬实时的, 抢占式基于优先级, 也按时间片轮转的调度系统。 VxWorks, Nuclues等为实时操作系统(RTOS)。 简单说, 线程被挂起, cpu去干别的事了, 该线程就算睡眠了... 2. 如何睡眠? 1). 被动睡眠, 比如时间片到了, cpu调度其他线程。irq中断来了, cpu去执行isr中断处理函数等。 2). 主动睡眠, 设置当前状态为TASK_INTERRUPTIBLE, 然后调用schedule()或者schedule_timeout()函数。 会主动放弃cpu, 进入挂起状态。 3. 等待队列的使用场景? 1). 以IO操作为例, 用户态读写操作时, 如果内核态文件系统/驱动设备 不满足情况。通常会阻塞住这次IO调用。 即read, write需要等待设备/数据ready后, 才能读出, 写入数据。 内核态有几种实现方式, A. 循环判断设备状态