



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
異步重要聯(lián)同步IO、異步IO、IO多路復(fù)同步Python中IO多路復(fù)用練異步編同步、異終打完飯。阻塞、非阻不立即返回就是阻塞調(diào)用區(qū)同步、異步,與阻塞、非阻塞不相關(guān)它方式通知調(diào)用者,來取回最終結(jié)果。非阻塞,調(diào)用者可以先去忙會(huì)別的,不用一聯(lián)同步非阻塞,我等著你打飯給我,但我可以玩會(huì)、看看電視。打飯是結(jié)果,但是我不一直等異步非阻塞,我要打飯,你說等叫號(hào),并沒有返回飯給我,我在旁邊看電視、玩,飯打好了叫我。同步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ù)用,就是同時(shí)多個(gè)IO,有一個(gè)準(zhǔn)備好了,就不需要等了開始處理,提高了同時(shí)處理IO的能力kqueue,Windows有iocp以slect為例,將關(guān)注的I操作告訴slect函數(shù)并調(diào)用,進(jìn)程阻塞,內(nèi)核“監(jiān)視”slect關(guān)注的文件描述符fd一個(gè)fd對(duì)應(yīng)的I準(zhǔn)備好了數(shù)據(jù),slect返回。再使用e將數(shù)據(jù)到用戶進(jìn)程。slect舉例,供應(yīng)很多菜(眾多的),你需要吃某三菜一湯,大師傅(操作系統(tǒng))說要現(xiàn)做,需要等,你只好等待。其中一樣菜好了,大師傅叫你過來說你點(diǎn)的菜有好的了,你得自己找找看哪一樣才好了,請(qǐng)服務(wù)員把做好的菜打給你。異步舉例,來打飯,跟大師傅說飯好了叫你,飯菜準(zhǔn)備好了,窗口服務(wù)員把飯盛好了打叫你。兩階段都是異步的。舉例,今天不想出去到飯店吃飯了,點(diǎn)外賣,飯菜在飯店做好了(第一階段),快遞員從飯店送到你家門口(階段)。Python中IOIO多路Linux2.5+支持epollPython的select實(shí)現(xiàn)了slect、pl系統(tǒng)調(diào)用,這個(gè)基本上操作系統(tǒng)都支持。部分實(shí)現(xiàn)了epoll。底層的I多路復(fù)用模塊。selectors實(shí)現(xiàn)實(shí)現(xiàn)slctrsDftSlctr返回當(dāng)前平臺(tái)最有效、性能最高的實(shí)現(xiàn)。,W的能為c。##在selects模塊源碼最下methodregister(?leobj,events,data=None)?leobj被監(jiān)視文件對(duì)象,例如socket對(duì)象events事件,該文件對(duì)象data可選的與此文件對(duì)象相關(guān)聯(lián)的不透明數(shù)據(jù),例如,關(guān)聯(lián)用來每個(gè)客戶端的會(huì)話ID,關(guān)聯(lián)方法。通過這個(gè)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這個(gè)文件對(duì)象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實(shí)例屬性上key=selector.register(sock,selectors.EVENT_READ,accept)e=defwhilenot#開始監(jiān)視,等到有文件對(duì)象 事件產(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)視,等到某文件對(duì)象 的事件產(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)視每一個(gè)與客戶端的連接的socketself.selector.register(conn,selectors.EVENT_READ,defrecv(self,sock:socket.socket):#接收客戶端數(shù)據(jù)data=ifnotdataordata==b'quit':#客戶端主動(dòng)斷開或退出,注銷并關(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,##注意,這里是某一個(gè)socket的寫操ane方法里面處理讀、寫,mask有可能是0b01、0b0、011。問題是,假設(shè)到了客戶端發(fā)來的數(shù)據(jù)后,如何寫出去?與每一個(gè)客戶端連接的sock對(duì)象,自己一個(gè)隊(duì)列,某一個(gè)客戶端收到信息后,會(huì)遍歷發(fā)給所有客戶端的隊(duì)列。這里完成一對(duì)多,即一份數(shù)據(jù)放到了所有隊(duì)列中。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)視,等到某文件對(duì)象被 的事件產(chǎn)生,返回(key,mask)元組events=self.selector.select()#阻塞,直到eventsforkey,maskinevents:ifcallable(key.data):callback=key.data#key對(duì)象的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)視每一個(gè)與客戶端的連接的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& 因?yàn)閷懸恢本途w,mask為2,所以一直可以寫,從而導(dǎo)致select()不斷循環(huán),如同不阻塞一ifnotlogginglogging.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CECS 10136-2021空氣濾料對(duì)20 nm~500 nm球形顆粒物過濾效率試驗(yàn)方法
- T/CECS 10126-2021氣凝膠絕熱厚型涂料系統(tǒng)
- T/CCSAS 049.2-2023石油化工企業(yè)安全泄放評(píng)估技術(shù)規(guī)范第2部分:氣液兩相流安全泄放技術(shù)要求
- T/CCS 061-2023智能化煤礦地質(zhì)保障系統(tǒng)運(yùn)維管理規(guī)范
- T/CCOA 60-2023中長(zhǎng)鏈甘油三酯食用油
- T/CCOA 18-2020紅棕櫚油
- T/CCMA 0191-2024高原隧道純電動(dòng)液壓挖掘機(jī)
- T/CCMA 0131-2022瀝青路面熱風(fēng)微波復(fù)合加熱就地?zé)嵩偕┕ひ?guī)程
- T/CCIAS 017-2023黑椒牛排醬
- 2024 - 2025學(xué)年一年級(jí)下冊(cè)道德與法治期末考試卷附答案(三套)
- 欠債用車抵債協(xié)議書
- 設(shè)計(jì)合作月結(jié)協(xié)議書
- 溴素行業(yè)分析報(bào)告
- 《基于PLC的包裝機(jī)控制系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)》10000字(論文)
- 地鐵安檢機(jī)考試題及答案
- 泰康之家管理體系
- 2025年浙江省金華市義烏市六年級(jí)下學(xué)期5月模擬預(yù)測(cè)數(shù)學(xué)試題含解析
- 高壓均質(zhì)及熱處理改性鷹嘴豆蛋白對(duì)減磷豬肉糜凝膠特性的影響機(jī)制
- 人效提升方案
- 2025春-新版一年級(jí)語(yǔ)文下冊(cè)生字表(200個(gè))
評(píng)論
0/150
提交評(píng)論