04io各種概念及多路復(fù)用_第1頁
04io各種概念及多路復(fù)用_第2頁
04io各種概念及多路復(fù)用_第3頁
04io各種概念及多路復(fù)用_第4頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

異步重要聯(lián)同步IO、異步IO、IO多路復(fù)同步Python中IO多路復(fù)用練異步編同步、異終打完飯。阻塞、非阻不立即返回就是阻塞調(diào)用區(qū)同步、異步,與阻塞、非阻塞不相關(guān)它方式通知調(diào)用者,來取回最終結(jié)果。非阻塞,調(diào)用者可以先去忙會別的,不用一聯(lián)同步非阻塞,我等著你打飯給我,但我可以玩會、看看電視。打飯是結(jié)果,但是我不一直等異步非阻塞,我要打飯,你說等叫號,并沒有返回飯給我,我在旁邊看電視、玩,飯打好了叫我。同步IO、異步IO、IO多路復(fù)IO過程分兩階段內(nèi)核空間回用戶進(jìn)程緩沖區(qū)階同步同步IO模型包括阻塞IO、非阻塞IO、IO多路阻塞進(jìn)程等待(阻塞),直到讀寫完成。(全程等待read/write非阻塞進(jìn)程調(diào)用e操作,如果O設(shè)備沒有準(zhǔn)備好,立即返回ERROR,進(jìn)程不阻塞。用戶可以再次發(fā)起系統(tǒng)調(diào)用,如果內(nèi)核已經(jīng)準(zhǔn)備好,就阻塞,然后數(shù)據(jù)到用戶空間。第二階段是阻塞的,即內(nèi)核空間和用戶空間之間數(shù)據(jù)是阻塞的。好飯。IO所謂IO多路復(fù)用,就是同時多個IO,有一個準(zhǔn)備好了,就不需要等了開始處理,提高了同時處理IO的能力kqueue,Windows有iocp以slect為例,將關(guān)注的I操作告訴slect函數(shù)并調(diào)用,進(jìn)程阻塞,內(nèi)核“監(jiān)視”slect關(guān)注的文件描述符fd一個fd對應(yīng)的I準(zhǔn)備好了數(shù)據(jù),slect返回。再使用e將數(shù)據(jù)到用戶進(jìn)程。slect舉例,供應(yīng)很多菜(眾多的),你需要吃某三菜一湯,大師傅(操作系統(tǒng))說要現(xiàn)做,需要等,你只好等待。其中一樣菜好了,大師傅叫你過來說你點的菜有好的了,你得自己找找看哪一樣才好了,請服務(wù)員把做好的菜打給你。異步舉例,來打飯,跟大師傅說飯好了叫你,飯菜準(zhǔn)備好了,窗口服務(wù)員把飯盛好了打叫你。兩階段都是異步的。舉例,今天不想出去到飯店吃飯了,點外賣,飯菜在飯店做好了(第一階段),快遞員從飯店送到你家門口(階段)。Python中IOIO多路Linux2.5+支持epollPython的select實現(xiàn)了slect、pl系統(tǒng)調(diào)用,這個基本上操作系統(tǒng)都支持。部分實現(xiàn)了epoll。底層的I多路復(fù)用模塊。selectors實現(xiàn)實現(xiàn)slctrsDftSlctr返回當(dāng)前平臺最有效、性能最高的實現(xiàn)。,W的能為c。##在selects模塊源碼最下methodregister(?leobj,events,data=None)?leobj被監(jiān)視文件對象,例如socket對象events事件,該文件對象data可選的與此文件對象相關(guān)聯(lián)的不透明數(shù)據(jù),例如,關(guān)聯(lián)用來每個客戶端的會話ID,關(guān)聯(lián)方法。通過這個Event含可讀0b01,內(nèi)核已經(jīng)準(zhǔn)備好輸入輸出設(shè)備,可以可寫0b10,內(nèi)核準(zhǔn)備好了,可以往里寫##回調(diào)函數(shù),自defaccept(sock:socket.socket,mask):"""mask:事件掩碼的或值"""conn,raddr=sock.accept()conn.setblocking(False)#不阻塞#監(jiān)視conn這個文件對象key=selector.register(conn,selectors.EVENT_READ,read)#回調(diào)函數(shù)defread(conn:socket.socket,mask):data=conn.recv(1024)msg="Yourmsgis{}.".format(data.decode())#構(gòu)造缺省性能最優(yōu)selector=#創(chuàng)建Tcpsock=socket.socket()sock.bind(('0.0.0.0',9999))sock.setblocking(False)#非阻 #將sock、關(guān)注事件、data都綁定到key實例屬性上key=selector.register(sock,selectors.EVENT_READ,accept)e=defwhilenot#開始監(jiān)視,等到有文件對象 事件產(chǎn)生,返回(key,mask)元組events=selector.select()print('-forkey,maskinevents:callback=key.data#回調(diào)函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',#開始監(jiān)視,等到某文件對象 的事件產(chǎn)生,返回(key,mask)元print('-'*forkey,maskinevents:callback=key.data#回調(diào)函數(shù)defaccept(self,sock:socket.socket):#接收客戶端連接conn,raddr=sock.accept()conn.setblocking(False)#非阻塞 ,監(jiān)視每一個與客戶端的連接的socketself.selector.register(conn,selectors.EVENT_READ,defrecv(self,sock:socket.socket):#接收客戶端數(shù)據(jù)data=ifnotdataordata==b'quit':#客戶端主動斷開或退出,注銷并關(guān)閉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':進(jìn)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。問題是,假設(shè)到了客戶端發(fā)來的數(shù)據(jù)后,如何寫出去?與每一個客戶端連接的sock對象,自己一個隊列,某一個客戶端收到信息后,會遍歷發(fā)給所有客戶端的隊列。這里完成一對多,即一份數(shù)據(jù)放到了所有隊列中。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#開始監(jiān)視,等到某文件對象被 的事件產(chǎn)生,返回(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()) ,監(jiān)視每一個與客戶端的連接的socketself.selector.register(conn,selectors.EVENT_READ|selectors.EVENT_WRITE,defhandle(self,key:selectors.SelectorKey,mask):#接收客戶端數(shù)據(jù)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,所以一直可以寫,從而導(dǎo)致select()不斷循環(huán),如同不阻塞一ifnotlogginglogging.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論