版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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)核空間回用戶進程緩沖區(qū)階同步同步IO模型包括阻塞IO、非阻塞IO、IO多路阻塞進程等待(阻塞),直到讀寫完成。(全程等待read/write非阻塞進程調(diào)用e操作,如果O設(shè)備沒有準(zhǔn)備好,立即返回ERROR,進程不阻塞。用戶可以再次發(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)用,進程阻塞,內(nèi)核“監(jiān)視”slect關(guān)注的文件描述符fd一個fd對應(yīng)的I準(zhǔn)備好了數(shù)據(jù),slect返回。再使用e將數(shù)據(jù)到用戶進程。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':進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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國新中式糕點行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2026年企業(yè)人力資源管理師之三級人力資源管理師考試題庫(奪分金卷)
- 2026年消防設(shè)施操作員之消防設(shè)備初級技能考試題庫150道及參考答案【考試直接用】
- 2026年網(wǎng)絡(luò)預(yù)約出租汽車駕駛員從業(yè)資格考試題庫及完整答案【必刷】
- 2026年設(shè)備監(jiān)理師之質(zhì)量投資進度控制考試題庫200道附參考答案(能力提升)
- 2026年網(wǎng)絡(luò)在線學(xué)法普法考試題庫附參考答案(a卷)
- 2026年設(shè)備監(jiān)理師考試題庫完整參考答案
- 2026年環(huán)境影響評價工程師之環(huán)評技術(shù)導(dǎo)則與標(biāo)準(zhǔn)考試題庫500道(歷年真題)
- 2026年二級注冊建筑師之建筑結(jié)構(gòu)與設(shè)備考試題庫500道帶答案(培優(yōu)a卷)
- 2026年設(shè)備監(jiān)理師之質(zhì)量投資進度控制考試題庫200道含答案【滿分必刷】
- 支撐梁鋼筋自動計算表模板
- 生物安全實驗室自查報告及整改措施
- 夫妻調(diào)解和好協(xié)議書
- 國企煤矸石承包合同范本
- 當(dāng)大學(xué)遇上心理健康智慧樹知到期末考試答案章節(jié)答案2024年東北農(nóng)業(yè)大學(xué)
- 監(jiān)控改造設(shè)計方案(2篇)
- 電氣防火技術(shù)檢測報告
- 2024年通遼市城市發(fā)展(集團)有限公司招聘筆試沖刺題(帶答案解析)
- 【全球6G技術(shù)大會】:2023通感一體化系統(tǒng)架構(gòu)與關(guān)鍵技術(shù)白皮書
- 引流管置管的健康宣教
- 《華為員工績效考核管理辦法》
評論
0/150
提交評論