异步io

java bio,nio,aio及源码

为君一笑 提交于 2019-12-01 06:52:19
版权声明:本文为博主原创文章,未经博主允许不得转载。 目录 (?) [+] NIO 简介 随着JavaIO类库的不断发展和改进,基于Java的网络编程会变得越来越简单。随着异步IO功能的增强,基于JavaNIO开发的网络服务器甚至不逊色与C++开发的网络程序。 记录一下学习BIO、NIO编程模型以及JDK1.7提供的NIO2.0的使用。 传统的BIO编程 这个可以搜索一下socket,就有很多。 通过一个线程来监听所有的socket连接,连接成功则新建线程去处理客户端操作。 问题是伸缩性差,随着并发访问量增大,会很好系统资源,可能造成处理失败。由于是阻塞时的读写,会造成较大的读写延迟。 源码略。 伪异步IO编程 为了解决传统的编程模型问题,有人使用线程池或者消息队列实现N各线程处理M个客户端的模型。M远大于N。 模型图 Acceptor是一个线程,通过死循环来监听socket连接,如果有连接成功,则新建Runnable对象,提交给线程池处理。 源码分析 跟BIO的代码差不多,只是在Server端加了线程池,来处理客户端socket连接。并将连接封装到Runnable对象,并交给ThreadPool处理。 弊端 通过以上模型及代码分析,很容易知道通信底层还是使用的socket,读写还是同步阻塞的,因此,以上优化只是减小了过多创建销毁线程的开销,并不能从根本上解决阻塞读写产生的问题。

并发编程目录

ぐ巨炮叔叔 提交于 2019-12-01 06:51:33
并发编程目录 并发编程之进程 1-1 进程理论 1-2 开启进程的两种方式 1-3 join方法 1-4 守护进程 1-5 互斥锁 1-6 队列 1-7 生产者消费者模型 并发编程之线程 2-1 线程理论 2-2 开启线程的两种方式 2-3 多线程和多进程的区别 2-4 Thread对象的其他属性或方法 2-5 守护线程 2-6 GIL全局解释器锁 2-7 死锁现象和递归锁 2-8 信号量 Event 定时器 2-9 线程queue 2-10 进程池与线程池 并发编程之协程 3-1 协程介绍 3-2 greenlet模块 3-3 gevent模块 IO模型 4-1 IO模型介绍 4-2 阻塞IO 4-3 非阻塞IO 4-4 多路复用IO模型 4-5 异步IO模型 4-6 IO模型对比 4-7 selectors模块 来源: https://www.cnblogs.com/shibojie/p/11664865.html

4-5 异步IO模型

放肆的年华 提交于 2019-12-01 06:49:24
异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入。先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。 来源: https://www.cnblogs.com/shibojie/p/11664833.html

4-1 IO模型介绍

こ雲淡風輕ζ 提交于 2019-12-01 06:48:42
IO模型介绍 同步\异步and阻塞\非阻塞(重点) 同步: #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。 #举例: #1. multiprocessing.Pool下的apply #发起同步调用后,就在原地等着任务结束,根本不考虑任务是在计算还是在io阻塞,总之就是一股脑地等任务结束 #2. concurrent.futures.ProcessPoolExecutor().submit(func,).result() #3. concurrent.futures.ThreadPoolExecutor().submit(func,).result() 异步: #异步的概念和同步相对。当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。 #举例: #1. multiprocessing.Pool()

【网络】第七章-典型IO模型

空扰寡人 提交于 2019-12-01 06:24:22
典型IO模型 IO的种类   IO模型根据特性可以分为以下几个种类: 阻塞IO,非阻塞IO,信号驱动IO,异步IO,多路转接IO 。 阻塞IO   为了IO发起IO调用,若IO条件不满足则一直等待,直到条件具备。 非阻塞IO   为了IO发起IO调用,若条件不满足则直接报错返回,执行其他指令。之后再次发起IO调用,条件不满足则继续报错返回,条件满足则直接进行数据拷贝后调用返回。   阻塞与非阻塞的区别在与 发起一个调用是否能够立即返回 。 信号驱动IO   自定义IO信号,如果IO条件具备则发送IO信号,收到信号后则打断其他操作进行信号处理,执行IO操作进行数据拷贝,结束后调用返回。 异步IO   自定义IO信号,发起IO调用,然后让操作系统进行等待条件满足,满足后操作系统进行数据拷贝,拷贝完后通知进程,进程收到后直接处理数据。   与之对应的是同步的操作同步与异步的区别在于 功能的完成是否由自身完成 。   那么是同步好还是异步好呢?答案是视使用场景而定。同步的流程控制更加简单,但是不管是否阻塞都会浪费CPU资源,因此对CPU的利用率不足。而异步对CPU的利用率更高,但是流程控制更加复杂,并且IO调用越多,同一时间占用的空间资源越多。   从以上IO种类来看,IO效率越来越高,但是流程控制越来越复杂,资源占用也越来越多。 多路转接IO   多路转接IO对大量描述符进行事件监控

tornado和异步IO的基本简单流程原理

痴心易碎 提交于 2019-12-01 05:08:57
tornado #建立连接 from tornado.httpclient import AsyncHTTPClient #发送请求 from tornado.httpclient import HTTPRequest #事件循环 from tornado import ioloop #接收的次数 REV_COUNTER = 0 #请求的次数 REQ_COUNTER = 0 def handle_response(reponse): """ 处理返回值内容(需要维护计数器,来停止IO循环),调用ioloop.IOLoop.current().stop :param reponse: :return: """ if reponse.error: print("Error:",reponse.error) else: print(reponse.body) global REV_COUNTER REV_COUNTER+=1 if REV_COUNTER == REQ_COUNTER: print(REQ_COUNTER) ioloop.IOLoop.current().stop() def func(): url_list = [ 'http://www.baidu.com', 'http://www.bing.com', ] global REQ_COUNTER REQ

基于IO模型的并发

拥有回忆 提交于 2019-11-30 19:52:31
基于IO模型的并发 一、IO模型介绍 本文所讨论的是Linux环境下的network IO,IO模型可以分为5种,分别是阻塞IO(blocking IO)、非阻塞IO(non-blocking IO)、多路复用IO(IO multiplexing)、异步IO(asynchronous IO)、信号驱动IO(signal IO)。其中信号驱动IO(signal IO)在实际中并不常用,所有主要介绍其余四种IO Model。 总结一下IO发生时涉及的对象和步骤。对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的进程 (线程),另一个就是系统内核(kernel)。当一个read操作发生时,该操作会经历两个阶段: #1)等待数据准备 (Waiting for the data to be ready) #2)将数据从内核拷贝到进程中(Copying the data from the kernel to the process) 这两个阶段很重要,因为这些IO模型的区别就是在两个阶段上各有不同的情况。 #1、输入操作:read、readv、recv、recvfrom、recvmsg共5个函数,如果会阻塞状态,则会经历wait data和copy data两个阶段,如果设置为非阻塞则在wait 不到data时抛出异常 #2、输出操作

五种IO模型

柔情痞子 提交于 2019-11-30 19:03:25
IO的产生   I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分.   当用户进程调用了recvfrom这个系统调用,就引发了一次IO过程,这个时候的IO就要等待系统去磁盘上将数据读取读来,再拷贝到进程中 在网络情况下,IO通常分为两步   1.等待系统准备数据   2.数据从内核中拷贝到进程中   如果想提高IO的效率,就要减少准备数据的时间. 通常的IO模型分为5种   1.阻塞IO   2.非阻塞IO   3.事件驱动IO   4.多路复用IO   5.异步IO 1.阻塞IO   在内核将数据拷贝到进程中之前,整个进程都处在等待状态,就是阻塞IO   A拿着一支鱼竿在河边钓鱼,并且一直在鱼竿前等,在等的时候不做其他的事情,十分专心。只有鱼上钩的时,才结束掉等的动作,把鱼钓上来。       2.非阻塞IO   每次进程询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当有数据报准备好时,就进行拷贝数据报的操作。当没有数据报准备好时,也不阻塞程序,内核直接返回未准备就绪的信号,等待用户程序的下一个轮寻,减少数据等待的时间,当准备数据时,进程是在非阻塞状态的,可以去做一些其他操作.   B也在河边钓鱼,但是B不想将自己的所有时间都花费在钓鱼上,在等鱼上钩这个时间段中,B也在做其他的事情(一会看看书,一会读读报纸,一会又去看其他人的钓鱼等)

网络编程之IO模型——异步IO

≯℡__Kan透↙ 提交于 2019-11-30 16:15:52
网络编程之IO模型——异步IO 异步IO(Asynchronous IO) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入。先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。 来源: https://www.cnblogs.com/Kwan-C/p/11603675.html

网络编程——IO模型介绍

房东的猫 提交于 2019-11-30 14:25:59
网络编程——IO模型介绍 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞。 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”,Stevens在这节中详细说明了各种IO的特点和区别,如果英文够好的话,推荐直接阅读。Stevens的文风是有名的深入浅出,所以不用担心看不懂。本文中的流程图也是截取自参考文献。 Stevens在文章中一共比较了五种IO Model: * blocking IO * nonblocking IO * IO