day10

今天的内容是IO
先说什么是IO,其实就是input和output,输入和输出
IO存在地方:
在内存中数据的交互都认为是IO操作
如:和终端的交互,print() input(),和磁盘的交互,read() write(),和网络的交互,recv() send()这些都是IO操作
IO密集型程序:就是在程序中,有大量的IO操作,少量的CPU运算,这种程序就IO密集型程序。
IO模型:主要有阻塞IO,非阻塞IO,IO多路复用,常见的就是这几个。
阻塞IO:
这种形式是IO的默认形式,当程序在执行的过程中,有某种条件位达成时,程序就会阻塞在那个地方,暂停执行,当条件达成时,再继续执行,一个很典型的例子就是,time模块中的sleep方法就是明显的阻塞方法,当程序执型到sleep所在的地方时,程序就会暂停执行,知道我们设定的时间达到,程序才会继续执行。当然,我们也可以设置一个超时检测,方法是sockfd settimeout(sec),参数设置等待的时长,比如,我们用sleep方法设置一个10秒的阻塞时间,我们再设置一个5秒的超时检测,那么,当过了五秒之后,条件还是没有达成,那么程序就不会再阻塞了,会继续往下执行。但是需要注意,超时检测这个方法不能用在非阻塞IO中,不然就没有意义了。
非阻塞IO:
sockfd.setblocking(bool(ture or false)),参数设置为false就是将程序设置为非阻塞IO,这样的程序运行到阻塞的地方时,不会再停下来等待条件达成,而而是继续运行下去。
IO多路复用:
在一个比较复杂的程序中,并不会只有一个IO,而是会有很多很多个IO,他们的存在是为了完成很多的功能的,但是个如果因为一个IO阻塞了,其他的IO也都不会运行,这样的程序效率是极其低下的,我们的程序不能成为低效的程序,所以就出现了IO多路复用技术,这个技术的理论是:当一个IO阻塞在某一个地方等待条件的达成,那么程序还是会去执行其他可以执行的IO,当这个阻塞的IO的条件达成时,再继续运行下去。举个生活中的例子就可以很形象的解释,当我们在家里做家务时,我么我们需要扫地和烧开水,那么我们都会是在烧开水的同时也在扫地,而并不会等着开水烧好了再扫地,这就是IO多路复用的实例。
实现IO多路复用的方法只要有这几个:select方法,poll方法,epoll方法。

select方法:

语法:rs,ws,xs = select(rlist,wlist,xlist[,timeout])		
功能:监控IO事件,阻塞等待IO事件发生
	参数:rlist  列表--->存放需要等待条件发生的IO事件
	     wlist  列表--->存放需要主动处理的IO事件
	     xlist  列表--->当发生异常比需要处理的IO事件
	     timeout --->超时时间,不加,则一直阻塞,加,在规定的时间后结束阻塞
	
	返回值:rs : 是一个列表,是rlist中准备就绪的IO
	       ws : 是一个列表,是wlist中准备就绪的IO
	       xs : 是一个列表,是xlist中准备就绪的IO

注意:
1.IO多路复用占用计算机资源较少,效率较高
2.wlist中如果有IO则select立即返回处理
3.在IO处理过程中不要出现死循环,影响IO监控

poll方法:

p = select.poll()   #创建poll对象
p.register(fd,event)
功能:注册要关注的IO
参数:fd要关注的IO对象
     event  要关注的事件

	常用事件类型:POLLIN  读IO rlist
		     POLLOUT 写IO wlist
		     POLLER  出错IO xlist
		     POLLHUP 断开连接事件

	例如:p.register(sockfd,POLLIN|POLLERR)

	p.unregister(fd)
	功能:取消关注
	参数:IO对象或者文件描述符

epoll方法:
epoll方法基本同poll方法类似,用法也类似

epoll的特点:
	*epoll是linux的专属多路复用方法
	*从工作上来说,工作效率比select和poll要高
	*epoll可以监控更多的IO(select 最多1024)
	*epoll支持更多的触发事件类型(就多了一个 epollet 边缘触发)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值