异步io

转: IO设计模式:Reactor和Proactor对比

一个人想着一个人 提交于 2020-03-19 02:44:30
转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点; 反应器Reactor Reactor模式结构 Reactor包含如下角色: Handle 句柄;用来标识socket连接或是打开文件; Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;) Event Handler:事件处理接口 Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑; Reactor:反应器,定义一个接口,实现以下功能: 1)供应用程序注册和删除关注的事件句柄; 2)运行事件循环; 3)有就绪事件到来时,分发事件到之前注册的回调函数上处理; “反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转” 具体事件处理程序不调用反应器,而是由反应器分配一个具体事件处理程序,具体事件处理程序对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我,让我来调用你) 业务流程及时序图 应用启动

I/O 模型

余生长醉 提交于 2020-03-19 02:40:20
2018-01-29 一、基本概念: 同步与异步 区别:多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。 阻塞与非阻塞: 区别:当发出请求一个操作时,如果条件不满足,是会一直等待还是返回一个标志信息 阻塞IO:当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。 非阻塞IO: 当用户线程发起一个read操作后,它马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。 所以在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。 同步IO 与 异步IO 区别:同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。 同步io:如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程。 异步io:IO操作的两个阶段都是由内核自动完成

浅谈I/O模型

…衆ロ難τιáo~ 提交于 2020-03-19 02:40:01
在学习线程,NIO等知识时都需要知道一些基础知识。 一、什么是同步或异步 同步:个人通俗理解多个人排队打饭一个窗口,只有前面一个人打完了,后面的人才能打。如果前面人因为什么原因一直站在那里不走,后面的人就一直需要等待。 如果有多个任务或事件要发生,多个任务或事件要逐个去执行,如果其中有一个事件或任务出现问题都会影响整个流程,其他任务都需要进行等待 异步:多个人排队打发多个窗口,每个人选择一个窗口不需要等待,一个人出现窗口占用,其他人不受影响。 多个任务或事件并发执行,一个任务或事件不会影响整个流程的暂时等待 示例1 典型的同步操作 方法在调用是从上到下依次执行, 只有fun1执行完成后,fun2才会被执行 void fun1(){ } void fun2(){ } main(){   fun1(); fun2(); } 示例2 主线程开启两个子线程 两个子线程调用互不影响 两个方法的调用也互不影响 fun1() 与 fun2()之间不需要等待 fun1(){} fun2(){} main(){   new Thread(){ public void run(){    fun1();  } }.start();    new Thread(){ public void run(){    fun2();  } }.start();     } 二、什么是阻塞 和非阻塞 阻塞

Java I/O模型的简单说明

∥☆過路亽.° 提交于 2020-03-19 02:39:21
  1、同步和异步   同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行,最简单的例子就是顺序的执行两个方法,当第一个方法正在执行时,那么第二个方法需要等待第一个方法执行完毕后才能继续执行   异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待,在Java中最常见的就是多线程来实现异步,执行一个方法的同时,开另外一个线程同时执行其他事情   2、阻塞和非阻塞   阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足,比如实现一个功能是读取指定目录下的文件的内容,如果文件不存在,那么程序将无限循环的进行读取,比如每隔3s继续读一次,就好像服务器一样一直在后台以服务形式运行着   非阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直在那等待,比如也是读取一个目录下指定文件,如果文件读取到,则返回文件的内容给程序,如果不存在则返回相应的状态,这段程序到这里就执行完毕了   同步、异步和阻塞、非阻塞之间没有必然联系,更不能划等号,   3、阻塞IO和非阻塞IO  

Java NIO:浅析I/O模型

ぃ、小莉子 提交于 2020-03-19 02:33:30
以下是本文的目录大纲:   一.什么是同步?什么是异步?   二.什么是阻塞?什么是非阻塞?   三.什么是阻塞IO?什么是非阻塞IO?   四.什么是同步IO?什么是异步IO?   五.五种IO模型   六.两种高性能IO设计模式 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。   这就是同步和异步。举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再执行,这样就不会由于A的执行导致整个任务的暂时等待。   如果还不理解,可以先看下面这2段代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 void fun1() { } void fun2() { } void function(){ fun1(); fun2() ..... ..... }   这段代码就是典型的同步

Java NIO:浅析I/O模型

烈酒焚心 提交于 2020-03-19 02:32:43
转载: Java NIO:浅析I/O模型 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。   这就是同步和异步。举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再执行,这样就不会由于A的执行导致整个任务的暂时等待。   如果还不理解,可以先看下面这2段代码: void fun1() { } void fun2() { } void function(){ fun1(); fun2() ..... ..... }   这段代码就是典型的同步,在方法function中,fun1在执行的过程中会导致后续的fun2无法执行,fun2必须等待fun1执行完毕才可以执行。   接着看下面这段代码: void fun1() { } void fun2() { } void function(){ new Thread()

Java NIO:浅析I/O模型

試著忘記壹切 提交于 2020-03-19 02:31:59
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:618528494 我们一起学Java!   也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。   以下是本文的目录大纲:   一.什么是同步?什么是异步?   二.什么是阻塞?什么是非阻塞?   三.什么是阻塞IO?什么是非阻塞IO?   四.什么是同步IO?什么是异步IO?   五.五种IO模型   六.两种高性能IO设计模式   若有不正之处,请多多谅解并欢迎批评指正。 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行

IO模型

房东的猫 提交于 2020-03-17 22:17:37
说实话 只是了解了几种io模型的基础知识 但实际上相关io模型的源码知识还有待进一步的学习 一、 IO 模型基本认知 BIO 里用户最关心 “ 我要读 ” , NIO 里用户最关心 ” 我可以读了 ” ,在 AIO 模型里用户更需要关注的是 “ 读完了 ” 下面引用知乎 一书焚城 的回答再次巩固一下 IO 模型 阻塞 IO , 给女神发一条短信, 说我来找你了, 然后就默默的一直等着女神下楼, 这个期间除了等待你不会做其他事情, 属于备胎做法. 非阻塞 IO , 给女神发短信, 如果不回, 接着再发, 一直发到女神下楼, 这个期间你除了发短信等待不会做其他事情, 属于专一做法. IO多路复用 , 是找一个宿管大妈来帮你监视下楼的女生, 这个期间你可以些其他的事情. 例如可以顺便看看其他妹子,玩玩王者荣耀, 上个厕所等等. IO复用又包括 select, poll, epoll 模式. 那么它们的区别是什么? 3.1 select大妈 每一个女生下楼 , select大妈都不知道这个是不是你的女神, 她需要一个一个询问, 并且select大妈能力还有限, 最多一次帮你监视1024个妹子 3.2 poll大妈 不限制盯着女生的数量 , 只要是经过宿舍楼门口的女生, 都会帮你去问是不是你女神 3.3 epoll大妈 不限制盯着女生的数量 , 并且也不需要一个一个去问. 那么如何做呢?

Python 高级编程和异步IO并发编程 --04_11 Python中的上下文管理器with语句

强颜欢笑 提交于 2020-03-17 12:00:06
# try_except_finally try: f_read = open("Tom.txt") print("code started") raise KeyError f_read.close() #raise IndexError # 此时就没有捕获到异常,代码出错 f_read.close() # 打开正常时,才会执行该语句,如果有抛出异常,则不会执行该语句, # 此时应该在每次抛出error时,都执行f_read.close(),这样才可以释放该文件 except KeyError as e: print("key error") f_read.close() else: print("other error") # 在没有抛异常时,捕捉其它异常。 finally: # 无论前面的代码是否允许,都会执行finally后面的语句 print("finally") f_read.close() # finally语句一般用于资源释放 # try_except_finally def exe_try(): try: print("code started") raise KeyError return 1 # 前一句,raise了一个KeyError,导致该语句没被执行 except KeyError as e: print("key error") return 2 #

Java多线程:Linux多路复用,Java NIO与Netty简述

蓝咒 提交于 2020-03-15 10:11:48
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: Winsock的select模型(感谢评论指正,仅Java NIO.2使用了Windows IOCP,由于Netty没有采用NIO.2此处不展开) Free BSD, OS X: kqueue 下面仅讲解Linux的多路复用。 Linux中的IO Linux的IO将所有外部设备都看作文件来操作,与外部设备的操作都可以看做文件操作,其读写都使用内核提供的系统调用,内核会返回一个文件描述符(fd, file descriptor),例如socket读写使用socketfd。描述符是一个索引,指向内核中一个结构体,应用程序对文件的读写通过描述符完成。 一个基本的IO,涉及两个系统对象:调用这个IO进程的对象,系统内核,read操作发生时流程如下: 通过read系统调用向内核发起读请求。 内核向硬件发送读指令,并等待读就绪。 内核把将要读取的数据复制到描述符所指向的内核缓存区中。 将数据从内核缓存区拷贝到用户进程空间中。 Linux I/O模型简介 阻塞I/O模型:最常用,所有文件操作都是阻塞的。 非阻塞I/O模型:缓冲区无数据则返回,一般采用轮询的方式做状态检查。 I/O复用模型:详细见下 信号驱动I/O:使用信号回调应用,内核通知用户何时开启一个I/O操作