异步io

python 协程, 异步IO Select 和 selectors 模块 多并发演示

被刻印的时光 ゝ 提交于 2019-12-26 00:42:13
主要内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 selectors 模块 多并发演示 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程: 协程是一种用户态的轻量级线程 。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。视作整体是原子性的核心。 方便切换控制流,简化编程模型 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。 缺点: 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上

12.python进程\\协程\\异步IO

谁都会走 提交于 2019-12-26 00:41:43
进程 Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了 multiprocessing模块中提供了Process , Queue , Pipe , Lock , RLock , Event , Condition等组件 , 与threading模块有很多相似之处 1.创建进程 from multiprocessing import Process import time def func(name): time.sleep(2) print('hello',name) if __name__ == '__main__': p= Process(target=func,args=('derek',)) p.start() # p.join() print('end...') View Code 2.进程间通讯 (1)Queue 不同进程间内存是不共享的,要想实现两个进程间的数据交换。进程间通信有两种主要形式 , 队列和管道 from multiprocessing import Process, Queue #Queue是进程排列 def f(test): test.put('22') #通过创建的子进程往队列添加数据,实线父子进程交互 if __name__ == '__main__': q = Queue()

初识BIO/NIO/AIO

不想你离开。 提交于 2019-12-24 04:12:24
阻塞与非阻塞的概念: 主要指的是访问IO的线程是否回阻塞(等待) 线程访问资源,该资源是否准备接续的一种处理方式 1.当线程去请求资源时如果发生了阻塞,该线程会等待资源就绪,直到可以调用该资资源的行为 2.当线程去请求资源时如果发送了阻塞,该线程不再等待该资源,继续执行其它功能的行为 同步与异步的概念:主要指的是数据的请求方式,同步和异步是指访问数据的一种机制 同步:当数据发送请求进行访问的时候,在获取到返回数据之前会阻塞。 异步:当数据发送请求进行访问的时候,在等待返回数据的同时,可以进行其它操作 同步阻塞IO,Block IO, IO操作时会阻塞线程,并发处理能力低。我们熟知的Socket编程就是BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务器不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。 同步非阻塞IO,None-Block IO NIO是对 BIO的改进,基于Reactor模型,我们知道,一个socket连接只有在特定时候才会发送数据传输IO操作, 大部分事件这个“数据传输”是空闲的,但还是占用着线程,NIO做出的改进就是“一个请求,一个线程”,在连接服务端的众多socket中

Socket 编程

风流意气都作罢 提交于 2019-12-23 05:35:44
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。 传输层 实现 端到端 的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是 主机 ,不是主机的 IP地址 ,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。 根据RFC793的定义: 端 口号 拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。 总之,套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。 套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中

Mina工作原理分析

。_饼干妹妹 提交于 2019-12-22 15:10:17
Mina是Apache社区维护的一个开源的高性能IO框架,在业界内久经考验,广为使用。Mina与后来兴起的高性能IO新贵Netty一样,都是韩国人Trustin Lee的大作,二者的设计理念是极为相似的。在作为一个强大的开发工具的同时,这两个框架的优雅设计和不俗的表现,有很多地方是值得学习和借鉴的。本文将从Mina工作原理的角度出发,对其结构进行分析。 总体结构 Mina的底层依赖的主要是Java NIO库,上层提供的是基于事件的异步接口。其整体的结构如下: IoService 最底层的是IOService,负责具体的IO相关工作。这一层的典型代表有IOSocketAcceptor和IOSocketChannel,分别对应TCP协议下的服务端和客户端的IOService。IOService的意义在于隐藏底层IO的细节,对上提供统一的基于事件的异步IO接口。每当有数据到达时,IOService会先调用底层IO接口读取数据,封装成IoBuffer,之后以事件的形式通知上层代码,从而将Java NIO的同步IO接口转化成了异步IO。所以从图上看,进来的low-level IO经过IOService层后变成IO Event。 具体的代码可以参考org.apache.mina.core.polling.AbstractPollingIoProcessor的私有内部类Processor。

应用程序与驱动程序交互函数DeviceIoControl详解

人盡茶涼 提交于 2019-12-21 03:32:50
这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTROL(DeviceIoControl函数会产生此IRP),MinorFunction 为自己定义的控制码的IRP,系统就调用相应的处理IRP_MJ_DEVICE_CONTROL的派遣函数,你在派遣函数中判断MinorFunction ,是自定义的控制码你就进行相应的处理。 一.先谈一下这个定义IO控制码 ,其实可以看作是一种通信协议。 看看CTL_CODE原型:    # define CTL_CODE( DeviceType, Function, Method, Access ) ( \   ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \   ) 可以看到,这个宏四个参数,自然是一个32位分成了4部分,高16位存储设备类型,14~15位访问权限,2~13位操作功能,最后0,1两位就是确定缓冲区是如何与I/O和文件系统数据缓冲区进行数据传递方式,最常见的就是METHOD_BUFFERED。 自定义CTL_CODE: #define IOCTL_Device_Function CTL_CODE

深入了解Netty【四】IO模型

匆匆过客 提交于 2019-12-21 02:55:36
引言 IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO复用模型、信号驱动式IO模型、异步IO模型。 因为学习Netty必不可少的要了解IO多路复用模型,本篇是基础。 名词概念 阻塞:指向调用方,在调用结果返回之前,调用方线程会挂起,直到结果返回。 非阻塞:指向调用方,在调用结果返回之前,调用方线程会处理其他事情,不会阻塞。 同步:指向被调用方,被调用方得到结果后再返回给调用方。 异步:指向被调用方,被调用方先应答调用方,然后计算结果,最终通知并返回给调用方。 recvfrom函数:系统调用,经socket接收数据。 5中IO模型 1、阻塞式IO模型(blocking I/O) 进程调用recvfrom函数,在数据没有返回之前,进程阻塞,直到数据返回后,才会处理数据。 2、非阻塞式IO模型(non-blocking I/O) 进程调用recvfrom函数,如果数据没有准备好就返回错误提示,之后进程循环调用recvfrom函数,直到有数据返回。 3、IO复用模型(I/O multiplexing) 进程调用select,如果没有套接字变为可读,则阻塞,直到有可读套接字之后,调用recvfrom函数,返回结果。 4、信号驱动式IO模型(signal-driven I/O) 进程先注册信号驱动,之后进程不阻塞,当数据准备好后

Linux 中的IO 模型

自闭症网瘾萝莉.ら 提交于 2019-12-20 00:24:20
IO分类 BIO 同步阻塞 NIO 同步非阻塞 AIO 异步非阻塞 Linux 中的IO 模型 用户空间与内核空间: 内核空间是指操作系统的内核,独立于其他的用户进程,有权限访问系统的底层的所有的硬件设备. 用户空间:其他的应用程序,这些应用程序不能直接访问系统的重要文件和设备,必须通过内核空间来间接的访问. 这样设计会更加的安全,一般4g的内存 1G是内核空间 3G是用户空间. 所有的进程都是在内核的支持下运行的. 内核可以控制一个在cpu运行的进程挂起, 也可以让等待的进程 阻塞 I/O ( blocking IO ) 在 linux 中,默认情况下所有的 socket 都是 blocking ,一个典型的读操作流程大概是这样: 当用户进程调用了 recvfrom 这个系统调用, kernel 就开始了 IO 的第一个阶段:准备数据(对于网络 IO 来说,很多时候数据在一开始还没有到达。比如,还没有收到一个完整的 UDP 包。这个时候 kernel 就要等待足够的数据到来)。这个过程需要等待,也就是说数据被拷贝到操作系统内核的缓冲区中是需要一个过程的。而在用户进程这边,整个进程会被阻塞(当然,是进程自己选择的阻塞)。当 kernel 一直等到数据准备好了,它就会将数据从 kernel 中拷贝到用户内存,然后 kernel 返回结果,用户进程才解除 block 的状态

一文理解Java IO/NIO/AIO

痴心易碎 提交于 2019-12-18 11:56:56
目录 概述 一、IO流(同步、阻塞) 二、NIO(同步、非阻塞) 三、NIO2(异步、非阻塞) 正文 概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous): 同步 是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而 异步 则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系 阻塞与非阻塞:在进行 阻塞 操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如ServerSocket新连接建立完毕,或者数据读取、写入操作完成;而 非阻塞 则是不管IO操作是否结束,直接返回,相应操作在后台继续处理 同步和异步的概念:实际的I/O操作 同步是用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行 异步是用户线程发起I/O请求后仍需要继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注册的回调函数 阻塞和非阻塞的概念:发起I/O请求 阻塞是指I/O操作需要彻底完成后才能返回用户空间 非阻塞是指I/O操作被调用后立即返回一个状态值,无需等I/O操作彻底完成 BIO、NIO、AIO的概述 首先,传统的 java.io包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象

一文看懂java io系统

帅比萌擦擦* 提交于 2019-12-17 00:20:19
学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的API。大部分程序都要处理一些输入,并由输入产生一些输出。Java为此提供了java.io包 java中io系统可以分为Bio,Nio,Aio三种io模型 关于Bio,我们需要知道什么是同步阻塞IO模型,Bio操作的对象:流,以及如何使用Bio进行网络编程,使用Bio进行网络编程的问题 关于Nio,我们需要知道什么是同步非阻塞IO模型,什么是多路复用Io模型,以及Nio中的Buffer,Channel,Selector的概念,以及如何使用Nio进行网络编程 关于Aio,我们需要知道什么是异步非阻塞IO模型,Aio可以使用几种方式实现异步操作,以及如何使用Aio进行网络编程 BIO BIO是同步阻塞IO,JDK1.4之前只有这一个IO模型,BIO操作的对象是流,一个线程只能处理一个流的IO请求,如果想要同时处理多个流就需要使用多线程 流包括字符流和字节流,流从概念上来说是一个连续的数据流。当程序需要读数据的时候就需要使用输入流读取数据,当需要往外写数据的时候就需要输出流 阻塞IO模型 在Linux中,当应用进程调用 recvfrom 方法调用数据的时候,如果内核没有把数据准备好不会立刻返回,而是会经历等待数据准备就绪