日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python之io概念

發(fā)布時間:2024/9/5 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之io概念 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
""" 同步,異步: 強調(diào)結(jié)果,調(diào)用者最終是否得到想要的結(jié)構(gòu) 阻塞非阻塞: 強調(diào)時間是否等待io二個階段 1.數(shù)據(jù)準備階段 2.內(nèi)核空間復制回用戶空間緩沖區(qū)階段發(fā)生io時候 1.內(nèi)核從輸入設備讀,寫數(shù)據(jù) 2.進程從內(nèi)核復制數(shù)據(jù)io模型 1.同步io包括阻塞io,非阻塞io,io多路復用阻塞io:進程等待(阻塞),直到讀寫完成非阻塞io:進程調(diào)用read操作,如果io沒有準備好,立即返回error,進程不阻塞用戶可以再次發(fā)起系統(tǒng)調(diào)用,內(nèi)核準備好,就阻塞,復制數(shù)據(jù)到用戶空間io多路復用:就是同時監(jiān)控多個io,有一個準備好,就不需要等待了開始處理,提高了同時處理io的功能select所以的平臺都支持,poll是對其的升級,epoll對poll的曾強增加回調(diào)機制,select最多監(jiān)控1024個fd,select輪詢的方式,效率低下epoll,fd沒有上限,并且是回調(diào)機制,不需要遍歷,效率高 2.異步io 進程發(fā)起異步io請求,立即返回,內(nèi)核完成io的二個階段,內(nèi)核給進程發(fā)一個信號 linix aio的系統(tǒng)調(diào)用 """ ''' abstractmethod register(fileobj,events,data=None) 為selector注冊一個文件對象,監(jiān)視他的io事件 fileobj被監(jiān)視文件對象,例如socket events事件,該文件對象必須等待的事件 data可選的與此文件對象相關聯(lián)的不透明數(shù)據(jù),例如關聯(lián)用來存儲每個客戶端的會話id event_read 可讀0b01內(nèi)核準備好輸入輸出設備,可以開始讀了 event_write可寫0b10內(nèi)核準備好了,可以寫了 '''  

io多路復用

import selectors import socket #在winodws上使用的是select,移植到linux就是epoll #recv,send就是io操作 sel = selectors.DefaultSelector()def accept(sock, mask):conn, addr = sock.accept() # Should be readyprint('accepted', conn, 'from', addr)conn.setblocking(False)sel.register(conn, selectors.EVENT_READ, read) #產(chǎn)生new_socket的時候調(diào)用read函數(shù)def read(conn, mask):data = conn.recv(1000) # Should be readyif data:print('echoing', repr(data), 'to', conn)conn.send(data) # Hope it won't blockelse:print('closing', conn)sel.unregister(conn)conn.close()sock = socket.socket() #產(chǎn)生fileobj sock.bind(('localhost', 1234)) sock.listen(100) sock.setblocking(False) #非阻塞,要求 sel.register(sock, selectors.EVENT_READ, accept) ##參數(shù)fileobj,events,data=None(回調(diào)函數(shù),或者數(shù)據(jù)) ''' 產(chǎn)生socket,就是有連接請求,傳給回調(diào)函數(shù)執(zhí)行 sock,selectors.EVENT_READ說明socket和讀就緒后執(zhí)行accept ''' # key = sel.register(sock, selectors.EVENT_READ, accept) key有四個屬性,fileobj,fd,events,datawhile True:events = sel.select() #阻塞,直到events(讀,寫)for key, mask in events: #key有四個屬性,fileobj,fd,envets,data(accept,read等回調(diào)函數(shù))callback = key.data #當socket接入時,key.data = acceptcallback(key.fileobj, mask) #accept(key.fileobj,mask) ,key.ffileoj就是sock

?

import socket import threading import datetime import selectorsclass ChatServer:def __init__(self,ip='127.0.0.1',port=9999):self.sock = socket.socketself.addr = (ip,port)self.event = threading.Event()self.selector = selectors.DefaultSelector()def start(self):self.sock.bind(self.addr)self.sock.listen()self.sock.setblocking(False)self.selector.register(self.sock,selectors.EVENT_READ,self.accept)threading.Thread(target=self.select,daemon=True).start()def select(self):while not self.event.is_set():events = self.selector.select()for key,mask in events:callback = key.datacallback(key.fileobj)def accept(self,sock:socket.socket):conn,addr = sock.accept()conn.setblocking(False)self.selector.register(conn,selectors.EVENT_READ,self.receive)def receive(self,sock:socket.socket):data = sock.recv(1024)if data ==b"":self.selector.unregister()self.sock.close()returnmsg = '{}:{}\n{}\n'.format(*sock.getpeername(),data.decode())for key in self.selector.get_map().values():if key.data==self.receive: #排除self.accept key.fileobj.send(msg)def stop(self):self.event.set()fobjs = []for fd,key in self.selector.get_map().items():fobjs.append(key.fileobj)for fobj in fobjs:self.selector.unregister(fobj)fobj.close()self.selector.close()def main():cs = ChatServer()cs.start()while True:cmd = input(">>>")if cmd == 'quit':cs.stop()break if __name__ == '__main__':main()

?

轉(zhuǎn)載于:https://www.cnblogs.com/harden13/p/9203857.html

總結(jié)

以上是生活随笔為你收集整理的Python之io概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。