04io各种概念及多路复用_第1页
04io各种概念及多路复用_第2页
04io各种概念及多路复用_第3页
04io各种概念及多路复用_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

异步重要联同步IO、异步IO、IO多路复同步Python中IO多路复用练异步编同步、异终打完饭。阻塞、非阻不立即返回就是阻塞调用区同步、异步,与阻塞、非阻塞不相关它方式通知调用者,来取回最终结果。非阻塞,调用者可以先去忙会别的,不用一联同步非阻塞,我等着你打饭给我,但我可以玩会、看看电视。打饭是结果,但是我不一直等异步非阻塞,我要打饭,你说等叫号,并没有返回饭给我,我在旁边看电视、玩,饭打好了叫我。同步IO、异步IO、IO多路复IO过程分两阶段内核空间回用户进程缓冲区阶同步同步IO模型包括阻塞IO、非阻塞IO、IO多路阻塞进程等待(阻塞),直到读写完成。(全程等待read/write非阻塞进程调用e操作,如果O设备没有准备好,立即返回ERROR,进程不阻塞。用户可以再次发起系统调用,如果内核已经准备好,就阻塞,然后数据到用户空间。第二阶段是阻塞的,即内核空间和用户空间之间数据是阻塞的。好饭。IO所谓IO多路复用,就是同时多个IO,有一个准备好了,就不需要等了开始处理,提高了同时处理IO的能力kqueue,Windows有iocp以slect为例,将关注的I操作告诉slect函数并调用,进程阻塞,内核“监视”slect关注的文件描述符fd一个fd对应的I准备好了数据,slect返回。再使用e将数据到用户进程。slect举例,供应很多菜(众多的),你需要吃某三菜一汤,大师傅(操作系统)说要现做,需要等,你只好等待。其中一样菜好了,大师傅叫你过来说你点的菜有好的了,你得自己找找看哪一样才好了,请服务员把做好的菜打给你。异步举例,来打饭,跟大师傅说饭好了叫你,饭菜准备好了,窗口服务员把饭盛好了打叫你。两阶段都是异步的。举例,今天不想出去到饭店吃饭了,点外卖,饭菜在饭店做好了(第一阶段),快递员从饭店送到你家门口(阶段)。Python中IOIO多路Linux2.5+支持epollPython的select实现了slect、pl系统调用,这个基本上操作系统都支持。部分实现了epoll。底层的I多路复用模块。selectors实现实现slctrsDftSlctr返回当前平台最有效、性能最高的实现。,W的能为c。##在selects模块源码最下methodregister(fileobj,events,data=None)fileobj被监视文件对象,例如socket对象events事件,该文件对象data可选的与此文件对象相关联的不透明数据,例如,关联用来每个客户端的会话ID,关联方法。通过这个Event含可读0b01,内核已经准备好输入输出设备,可以可写0b10,内核准备好了,可以往里写##回调函数,自defaccept(sock:socket.socket,mask):"""mask:事件掩码的或值"""conn,raddr=sock.accept()conn.setblocking(False)#不阻塞#监视conn这个文件对象key=selector.register(conn,selectors.EVENT_READ,read)#回调函数defread(conn:socket.socket,mask):data=conn.recv(1024)msg="Yourmsgis{}.".format(data.decode())#构造缺省性能最优selector=#创建Tcpsock=socket.socket()sock.bind(('0.0.0.0',9999))sock.setblocking(False)#非阻 #将sock、关注事件、data都绑定到key实例属性上key=selector.register(sock,selectors.EVENT_READ,accept)e=defwhilenot#开始监视,等到有文件对象 事件产生,返回(key,mask)元组events=selector.select()print('-forkey,maskinevents:callback=key.data#回调函callback(key.fileobj,threading.Thread(target=select,args=(e,),name='select').start()defmain():whilenote.is_set():cmd=ifcmd.strip()=='quit':fobjs=[]练threadingthreading.Thread(target=self.select,name='selector',#开始监视,等到某文件对象 的事件产生,返回(key,mask)元print('-'*forkey,maskinevents:callback=key.data#回调函数defaccept(self,sock:socket.socket):#接收客户端连接conn,raddr=sock.accept()conn.setblocking(False)#非阻塞 ,监视每一个与客户端的连接的socketself.selector.register(conn,selectors.EVENT_READ,defrecv(self,sock:socket.socket):#接收客户端数据data=ifnotdataordata==b'quit':#客户端主动断开或退出,注销并关闭socketmsg="{:%Y/%m/%d%H:%M:%S}msg=msg.encode()forkeyinself.selector.get_map().values():ifkey.data==self.recv:#排除self.acceptdefstop(self):#停止服fobjs=[]forfd,keyinself.selector.get_map().items():forfobjinfobjs:defcs=ChatServer()whilecmd=input('>>').strip()ifcmd=='quit': =='main':进self.selector.register(conn,selectors.EVENT_READ|selectors.EVENT_WRITE,defrecv(self,sock,但是由于recv方法处理读和写事件,所defrecv(self,sock,defhandle(self,sock,##注意,这里是某一个socket的写操ane方法里面处理读、写,mask有可能是0b01、0b0、011。问题是,假设到了客户端发来的数据后,如何写出去?与每一个客户端连接的sock对象,自己一个队列,某一个客户端收到信息后,会遍历发给所有客户端的队列。这里完成一对多,即一份数据放到了所有队列中。selfself.sock.setblocking(False)##self.selector.register(self.sock,selectors.EVENT_READ,self.accept)threading.Thread(target=self.select,name='selector',daemon=True).start()defselect(self):#whilenot#开始监视,等到某文件对象被 的事件产生,返回(key,mask)元组events=self.selector.select()#阻塞,直到eventsforkey,maskinevents:ifcallable(key.data):callback=key.data#key对象的data属性,回callback(key.fileobj,mask)callback=key.data[0]callback(key,mask)defaccept(self,sock:socket.socket,mask):#接收客户端连接conn,raddr=sock.accept()conn.setblocking(False)#非阻塞self.clients[raddr]=(self.handle,Queue()) ,监视每一个与客户端的连接的socketself.selector.register(conn,selectors.EVENT_READ|selectors.EVENT_WRITE,defhandle(self,key:selectors.SelectorKey,mask):#接收客户端数据ifmask&selectors.EVENT_READ:sock=key.fileobjraddr=sock.getpeername()data=sock.recv(1024)ifnotdataordata==b'quit':msg="{:%Y/%m/%d{}:{}\n{}\n".format(*raddr,data.decode())msg=forkinself.selector.get_map().values():ifisinstance(k.data,tuple):ifmask& 因为写一直就绪,mask为2,所以一直可以写,从而导致select()不断循环,如同不阻塞一ifnotlogginglogging.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论