与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。

主要应用:

(1)客户程序需要同时处理交互式的输入和服务器之间的网络连接

(2)客户端需要对多个网络连接作出反应

(3)TCP服务器需要同时处理多个处于监听状态和多个连接状态的套接字

(4)服务器需要处理多个网络协议的套接字

(5)服务器需要同时处理不同的网络服务和协议

select()函数

#include <sys/time.h>
int select(int nfds, fd_set *readfds,fd_set *wtitefds, fd_set *errnofds,
struct timeval *timeout)

注意:描述符不受限与套接字,任何描述符都行

nfds:select()函数监视的描述符数的最大值,一般取监视的描述符数的最大值+1,

其上限设置在sys/types.h中有定义

#define FD_SETSIZE 256

readfds:select()函数监视的可读描述符集合

wtitefds:select()函数监视的可写描述符集合

errnofds:select()函数监视的异常描述符集合

timeout:select()函数监视超时结束时间,取NULL表示永久等待

timeout告知内核等待所指定描述字中的任何一个就绪可花多少时间。其timeval结构用于指定这段时间的秒数和微秒数。

        struct timeval{long tv_sec;   //secondslong tv_usec;  //microseconds};

这个参数有三种可能:

(1)永远等待下去:仅在有一个描述字准备好I/O时才返回。为此,把该参数设置为空指针NULL。

(2)等待一段固定时间:在有一个描述字准备好I/O时返回,但是不超过由该参数所指向的timeval结构中指定的秒数和微秒数。

(3)根本不等待:检查描述字后立即返回,这称为轮询。为此,该参数必须指向一个timeval结构,而且其中的定时器值必须为0。

返回值:返回总的位数这些位对应已准备好的描述符,否则返回-1

相关宏操作:

      FD_ZERO(fd_set *fdset):清空fdset与所有描述符的关系FD_SET(int fd, d_set * fdset):建立描述符fd与fdset得关系FD_CLR(int fd, d_set * fdset):撤销描述符fd与fdset得关系FD_ISSET(int fd, d_set * fdset):检查与fdset联系的描述符fd是否可以读写,返回非零表示可以读写

select()函数实现IO多路复用的步骤

(1)清空描述符集合

(2)建立需要监视的描述符与描述符集合的关系

(3)调用select函数

(4)检查监视的描述符判断是否已经准备好

(5)对已经准备好的描述符进程IO操作

转载于:https://www.cnblogs.com/new0801/p/6176981.html

Linux企业级项目实践之网络爬虫(27)——多路IO复用相关推荐

  1. Linux企业级项目实践之网络爬虫(29)——遵守robots.txt

    Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以 ...

  2. Linux企业级项目实践之网络爬虫(2)——网络爬虫的结构与工作流程

    网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份. 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分 ...

  3. Linux企业级项目实践之网络爬虫(28)——爬虫socket处理

    Socket是进程之间交换数据的机制.这些进程即可以是同一台机器上的,也可以是通过网络连接起来的不同机器.一旦一个Socket连接建立,那么数据就能够双向传输,直到其中一端关闭连接. 通常,请求数据的 ...

  4. Redis网络多路IO复用以及底层原理

    老早听说过Redis是单线程,但指的是什么单线程,为什么单线程,底层实现原理是什么? 单线程指的是Redis中处理网络请求的模块是单线程处理的,并非指整一个Redis软件都是单线程,肯定有其它线程做其 ...

  5. 多路IO复用(Linux)

    一.介绍 多路IO复用,是通过系统底层对描述符事件的检测,通过描述符集合返回,通过描述符集合实现对单一句柄操作 多路IO复用有三种: (1)select (2)poll (3)epoll 对比: 特点 ...

  6. C语言网络编程:多路IO select实现多客户端

    文章目录 阻塞式的服务器程序 多线程服务器程序 非阻塞式服务器程序 基于事件响应的服务器程序 事件响应服务器程序的实现`select` 阻塞式的服务器程序 我们接触过最多的最基础的网络通信模型为TCP ...

  7. 【ML项目】基于网络爬虫和数据挖掘算法的web招聘数据分析(一)——数据获取与处理

    前言 这个项目是在学校做的,主要是想对各大招聘网站的招聘数据进行分析,没准能从中发现什么,这个项目周期有些长,以至于在项目快要结束时发现网上已经有了一些相关的项目,我后续会把相关的项目材料放在我的Gi ...

  8. 网络爬虫--27.csv文件的读取和写入

    文章目录 一. csv文件 二. 读取csv文件的两种方式 三. 写入csv文件的两种方式 一. csv文件 二. 读取csv文件的两种方式 import csvdef read_csv_demo1( ...

  9. Linux网络编程(高级IO)-典型IO,多路IO复用

    IO:输入输出   过程:等待IO就绪,进行数据拷贝 四种典型IO方式: (1)阻塞IO:发起IO调用,若IO未就绪(IO条件不具备)则一直等待 (2)非阻塞IO:发起IO调用,若IO未就绪(IO条件 ...

  10. Linux服务器7 --- 多路IO复用+线程池服务端模型(高并发)分析

    一.服务端特性概述 1.使用EPOLL模型在服务器中加入(网络IO监听,大量的监听能力) EPOLL采用边缘触发模式(后话) 2.线程池模型进行并发处理业务(并发处理能力) 1)提高线程重用性(避免频 ...

最新文章

  1. 2019年十大数据与分析技术趋势
  2. Nature子刊:改进宏基因组的分箱和组装的新方法
  3. css中底部sticky footer
  4. Python 空值与非空值
  5. JS实现星星评分功能实例代码(两种方法)
  6. win7关机快捷键_电脑快捷键大全(上)
  7. 并查集模板——并查集(洛谷 P3367)
  8. 缓存系列文章–无底洞问题
  9. Android package属性、package name和Application ID三者的联系及区别
  10. 教你定时爬取微博热搜榜并做动态数据展示,让你不错过任何一个吃瓜热点
  11. mac 学习 java_Mac 新手从零学习JAVA 环境配置篇
  12. 小程序注册及域名服务器需要准备的资料
  13. nba2k21那个php是啥,NBA2K21不同版本区别介绍 各版本详细信息及奖励内容一览
  14. 计算机技术职业资格考试
  15. 目前大多数计算机工作原理采用的是,计算机应用基础复习题2016有答案
  16. 听听那冷雨 -- 余光中
  17. 身份实名认证API开发文档
  18. iSCSI网络SCSI接口
  19. 网易大数据面试题试解
  20. Homestead 安装 phpMyAdmin 作为数据库管理客户端 — Laravel 实战 果酱 API 教程

热门文章

  1. 学界还是业界?当 IT 女孩们面临未来选择
  2. 【CS224N笔记】一文详解神经网络来龙去脉
  3. 【CV】计算机视觉入坑必备
  4. 【AAAI会议】三位教父上演神仙打架,Hinton吐槽CNN就是个“垃圾”
  5. step-by-step: 夕小瑶版神经网络调参指南
  6. 深度学习框架如何优雅的做算子对齐任务?
  7. leetcode不同路径-结题( C++、Python、解析式)
  8. 集合阿里云、达摩院、平头哥相关技术的HaaS,官宣出书啦
  9. 4.1 Spark SQL概述
  10. 90 矩阵——矩阵微分与求导