多路复用

IO多路复用丶基于IO多路复用+socket实现并发请求丶协程

匿名 (未验证) 提交于 2019-12-02 22:11:45
一丶IO多路复用   IO多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作   IO多路复用作用:     检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写)     操作系统检测socket是否发生变化有三种模式:       select:最多1024个socket,循环去检测       poll:不限制监听socket个数,循环去检测(水平触发)       epoll:不限制监听socket个数:回调方式(边缘触发).     Python模块:       select.select       select.epoll   Python中有一个select模块,其中提供了:select丶poll丶epoll三个方法,分别调用系统的select,poll,epoll从而实现IO多路复用 二丶基于IO多路复用+socket实现并发请求(一个线程100个请求)   当我们需要向百度发送请求搜索三个关键字,我们改怎么办呢?   单线程解决并发: 方式一: key_list = ['alex','db','sb'] for item in key_list: ret = requests.get('https://www.baidu.com/s?wd=%s'

Netty事件监听和处理(上)

匿名 (未验证) 提交于 2019-12-02 21:53:32
陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app。 今天给大家送了福利:小爱音箱F码,据说卖的比较好,不太好抢到,借着这次公司福利,分享给大家,以表大家的支持和鼓励。 掘金的运营真的很贴心,主动找到我说:我的福利文章不是技术型文章,不能推送到信息流,只能在个人主页看到,为了让更多的人参与这次抽取,建议写一篇技术文章,末尾加上送福利的内容。再次感谢掘金运营小哥「刺客」的贴心和建议。 RabbitMQ实战的后续章节还没来得及看,这篇就总结下之前在项目组分享过的技术点:Netty事件监听和处理。 通过介绍,你会了解到: 事件监听、NIO、线程模型等相关概念; Netty总体结构; 事件监听和处理; 项目实践总结; 本篇先介绍下前两节,下一篇介绍后两节。 本篇最后会说明下福利的抽取规则,大家积极参与 >_< Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理。 所以,先介绍下事件监听、责任链模型、socket接口和IO模型、线程模型等基本概念,对后面理解Netty的事件监听和处理有很大帮助。 JDK监听器模式主要包含以下元素:

python--io多路复用之select实现

回眸只為那壹抹淺笑 提交于 2019-12-02 20:18:56
1、I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 2、I/O多路复用避免阻塞在io上,原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理。 select select是通过系统调用来监视一组由多个文件描述符组成的数组,通过调用select()返回结果,数组中就绪的文件描述符会被内核标记出来,然后进程就可以获得这些文件描述符,然后进行相应的读写操作 select的实际执行过程如下: 1、select需要提供要监控的数组,然后由用户态拷贝到内核态。 2、内核态线性循环监控数组,每次都需要遍历整个数组。 3、内核发现文件描述符状态符合操作结果,将其返回。 所以对于我们监控的socket都要设置为非阻塞的,只有这样才能保证不会被阻塞。 优点 基本各个平台都支持 缺点 1、每次调用select,都需要把fd集合由用户态拷贝到内核态,在fd多的时候开销会很大 2、单个进程能够监控的fd数量存在最大限制,因为其使用的数据结构是数组。 3、每次select都是线性遍历整个数组,当fd很大的时候,遍历的开销也很大 python使用select 语法:r_list, w_list, e_list = select.select( rlist, wlist, errlist

IO操作

蹲街弑〆低调 提交于 2019-12-02 10:59:46
文章目录 IO简介 IO分类 阻塞IO 非阻塞IO IO多路复用 select 位运算 poll IO简介 IO input output 在内存中存在数据交换的操作都可以认为是IO操作 和终端交互 : input print 和磁盘交互 : read write 和网络交互 : recv send IO密集型程序 : 在程序执行过程中存在大量IO操作,而cpu运算操作较少。消耗cpu较少,运行效率较低 计算密集型程序(cpu密集型程序):在程序执行中cpu运算较多,IO操作相对较少。消耗cpu大,运行速度快 IO分类 阻塞IO 非阻塞IO IO多路复用 阻塞IO 阻塞IO是IO的默认形态,是效率较低的一种IO情形。 阻塞情况 * 因为某种条件没有达成造成的阻塞 e.g. accept input recv * 处理IO数据传输时间较长形成的阻塞 e.g. 网络传输过程,文件读写过程 非阻塞IO 通过修改IO事件的属性,使其变为非阻塞状态。(让一些条件阻塞函数不再阻塞) 非阻塞IO往往和循环判断一起使用 s.setblocking(False) 将套接字设置为非阻塞状态 超时检测 将原本阻塞的函数设置一个最长阻塞时间。如果时间内条件达成则正常运行,如果仍然阻塞则视为超时,继续向下运行或产生异常 s.settimeout(sec) 设置套接字的超时时间 IO多路复用 定义 :

Netty系列---IO多路复用技术

删除回忆录丶 提交于 2019-12-02 06:29:14
形成的原因: 如果一个I/O流进来,我们就开启一个进程处理这个I/O流。那么假设现在有一百万个I/O流进来,那我们就需要开启一百万个进程一一对应处理这些I/O流(——这就是传统意义下的 多进程并发处理 )。思考一下,一百万个进程,你的CPU占有率会多高,这个实现方式及其的不合理。所以人们提出了I/O多路复用这个模型, 一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力 。 I/O多路复用的实现: 我们来分析一下上面这张图 当进程调用select,进程就会被阻塞 此时内核会监视所有select负责的的socket,当socket的数据准备好后,就立即返回。 进程再调用read操作,数据就会从内核拷贝到进程。 其实多路复用的实现有多种方式:select、poll、epoll select的基本原理: 监视文件3类描述符: writefds、readfds、和exceptfds; 调用后select函数会阻塞住,等有数据 可读、可写、出异常 或者 超时 就会返回 select函数正常返回后,通过遍历fdset整个数组才能发现哪些句柄发生了事件,来找到就绪的描述符fd,然后进行对应的IO操作 几乎在所有的平台上支持,跨平台支持性好 缺点: select采用轮询的方式扫描文件描述符,全部扫描,随着文件描述符FD数量增多而性能下降 每次调用 select(),需要把

理解I/O复用

ⅰ亾dé卋堺 提交于 2019-12-02 05:08:59
原文地址 https://blog.csdn.net/xd_rbt_/article/details/80287959 I/O复用就是单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流. 假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。 你会怎么做? 最简单的做法,就是你去招一大批空管员,然后每人盯一架飞机, 从进港,接客,排位,出港,航线监控,直至交接给下一个空港,全程监控。 那么问题就来了: 很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。 空管员之间需要协调,屋子里面就1, 2个人的时候还好,几十号人以后 ,基本上就成菜市场了。 空管员经常需要更新一些公用的东西,比如起飞显示屏,比如下一个小时后的出港排期,最后你会很惊奇的发现,每个人的时间最后都花在了抢这些资源上。 现实上我们的空管同时管几十架飞机稀松平常的事情, 他们怎么做的呢? 他们用这个东西 ·这个东西叫flight progress strip. 每一个块代表一个航班,不同的槽代表不同的状态,然后一个空管员可以管理一组这样的块(一组航班),而他的工作,就是在航班信息有新的更新的时候,把对应的块放到不同的槽子里面。 这个东西现在还没有淘汰哦,只是变成电子的了而已。。

IO多路复用,协程

倖福魔咒の 提交于 2019-12-01 13:22:26
https://www.cnblogs.com/wangjun187197/p/9642429.html Python之路--协程/IO多路复用 引子:   之前学习过了,线程,进程的概念,知道了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把CPU的利用率提高很多了.但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程,创建线程,以及管理他们之间的切换.   随着我们对于效率的最求不断提高,基于单线程来实现并发又成为一个新的课题.即只用一个主线程的情况下实现并发.这样就可以节省创建线程进程所消耗的时间.   并发的本质: 切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是任务发生了阻塞,另外一种情况是该任务计算时间过长      对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线程能够最大限度地处于就绪态,即随时都可以被cpu执行的状态,相当于我们在用户程序级别将自己的io操作最大限度地隐藏起来,从而可以迷惑操作系统,让其看到:该线程好像是一直在计算,io比较少

计算机网络技术知识点总结

为君一笑 提交于 2019-12-01 08:40:16
根据网络覆盖范围:局域网,城域网,广域网,互联网。 根据所有权性质:专用网,公用网。 根据传输介质:有线网络,无线网络。 TCP/IP参考模型:应用层,传输层,网络互联层,网络接口层。 总线形网络,星形网络,树形网络,环形网络,网状网络。 常用的数据传输同步方式 同步式 异步式 计算机网络定量的性能指标:速率,带宽,端到端延迟,吞吐量 网络协议3要素:语法,语义,同步(时序关系)。 计算机网络具有分布式处理功能,可以提高网络的 可靠性。 IP v6将IP地址设置为128位。 计算机中的数据:数字,文字,图像。 同步时分多路复用与异步时分多路复用主要区别:在同步时分多路复用中,分配给每个信号源的时隙是固定的,各个信号源的时隙不可相互转让。 数据在通信系统中按传输的信号是否需要经过调制分为:频带传输,基带传输。 B类IP地址,网络号字段占2个字节。C类IP地址,网络号字段占3个字节(24位)。 根 顶级域名(com,cn) 二级域名(ibm,yahoo,edu) 三级域名(www,ftp,pku) 四级域名 来源: https://www.cnblogs.com/aikeming/p/11673582.html

Java核心技术36讲

随声附和 提交于 2019-12-01 08:14:09
IO 一直是软件开发中的 核心 部分之一,伴随着海量数据增长和分布式系统的发展,IO 扩展能力愈发重要。幸运的是, Java 平台 IO 机制经过不断完善,虽然在某些方面仍有不足,但已经在实践中证明了其构建高扩展性应用的能力。 今天我要问你的问题是, Java 提供 了 哪些 IO 方式 ? NIO 如何 实现 多路复用? 典型回答 Java IO 方式 有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。 首先,传统的 java.io 包,它基于流模型 实现 , 提供 了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。 java.io 包的好处是代码比较简单、直观,缺点则是 IO 效率和扩展性存在局限性,容易成为应用性能的瓶颈。 很多时候,人们也把 java.net 下面提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。 第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的