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

news/2024/7/19 11:10:36 标签: 爬虫, 网络

 

与多线程和多进程相比,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;   //seconds
                   long 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/niulanshan/p/6174770.html


http://www.niftyadmin.cn/n/1159260.html

相关文章

Spark系列修炼---入门笔记13

核心内容&#xff1a; 1、小编带你通过WordCount程序查看Spark与MapReduce的诸多雷同情节 今天通过数据流动的角度再一次从整体上认知了Spark中的WordConunt程序&#xff0c;但是在分析的过程中&#xff0c;给我的第一个感觉就是Spark的运行过程与MapReduce有很多相似之处&…

CSS3 transition

最近学习了jQuery&#xff0c;css3相对用得较少&#xff0c;众所周知css3在对浏览器有所要求&#xff0c;为了自己设计的网页能更好的满足大部分浏览器&#xff0c;所以很多时候要做动画&#xff0c;都考js来实现&#xff0c;恰好jQuery能对浏览器的很好兼容&#xff0c;所以最…

FFmpeg 结构体与函数 简单记录

记录FFmpeg的相关结构体与函数。 libavcodec: 提供了一系列编码器的实现 libavformat: 实现在流协议&#xff0c;容器格式及基本IO访问 libavutil: 包含了hash器&#xff0c;解码器和各种函数 libavfilter: 提供了各种音视频过滤器 libavdevice: 提供了访问捕获设备和回放设备的…

Spark系列修炼---入门笔记14

核心内容&#xff1a; 1、如何搭建HA下的Spark集群模式 好了&#xff0c;进入本篇博客的正题&#xff0c;本篇博客主要内容为搭建HA下的Spark集群&#xff0c;在搭建之前&#xff0c;先看一下Spark的运行模式&#xff1a; 从运行模式上我们可以看出&#xff0c;我们需要先搭…

Android setContentView流程

更新于&#xff1a;2022-01-09 Android-30 implementation ‘androidx.appcompat:appcompat:1.2.0’ setContentView并没有将view添加到屏幕上&#xff0c;只是创建了DecorView&#xff0c;xml添加到DecorView而已。 文章目录MainActivity 继承Activity的setContentView流程1) …

Spark系列修炼---入门笔记15

核心内容&#xff1a; 1、Spark架构入门笔记 2、ClusterManager–资源调度、Driver—作业运行调度的详解 今天进一步深入学习了Spark,主要学习的内容为Spark的核心架构&#xff0c;好的&#xff0c;进入本篇文章的正题。 注意&#xff1a;本篇文章谈的是Spark的StanAlone模式…

mysql: Packet for query is too large 和Data too long for column

今天在用mysql开发项目的时候&#xff0c;用BLOB字段存储文件二进制流。 一、先是报异常 com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column title at row 1 发现上传的文件大于65535字符&#xff08;mysql在UTF-8编码下汉字也是一个字符&#x…

Spark系列修炼---入门笔记16

核心内容&#xff1a; 1、Hadoop1.0&#xff0c;Hadoop2.0&#xff0c;Spark的作业运行机制图解 MapReduce程序的编写流程&#xff1a; Hadoop1.0的作业运行机制&#xff1a; Hadoop2.0作业运行机制&#xff1a; Spark的作业运行机制&#xff1a; OK&#xff01;