Python之io概念
生活随笔
收集整理的這篇文章主要介紹了
Python之io概念
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
"""
同步,異步:
強調結果,調用者最終是否得到想要的結構
阻塞非阻塞:
強調時間是否等待io二個階段
1.數據準備階段
2.內核空間復制回用戶空間緩沖區階段發生io時候
1.內核從輸入設備讀,寫數據
2.進程從內核復制數據io模型
1.同步io包括阻塞io,非阻塞io,io多路復用阻塞io:進程等待(阻塞),直到讀寫完成非阻塞io:進程調用read操作,如果io沒有準備好,立即返回error,進程不阻塞用戶可以再次發起系統調用,內核準備好,就阻塞,復制數據到用戶空間io多路復用:就是同時監控多個io,有一個準備好,就不需要等待了開始處理,提高了同時處理io的功能select所以的平臺都支持,poll是對其的升級,epoll對poll的曾強增加回調機制,select最多監控1024個fd,select輪詢的方式,效率低下epoll,fd沒有上限,并且是回調機制,不需要遍歷,效率高
2.異步io
進程發起異步io請求,立即返回,內核完成io的二個階段,內核給進程發一個信號
linix aio的系統調用
"""
'''
abstractmethod register(fileobj,events,data=None)
為selector注冊一個文件對象,監視他的io事件
fileobj被監視文件對象,例如socket
events事件,該文件對象必須等待的事件
data可選的與此文件對象相關聯的不透明數據,例如關聯用來存儲每個客戶端的會話id
event_read 可讀0b01內核準備好輸入輸出設備,可以開始讀了
event_write可寫0b10內核準備好了,可以寫了
'''
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) #產生new_socket的時候調用read函數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() #產生fileobj sock.bind(('localhost', 1234)) sock.listen(100) sock.setblocking(False) #非阻塞,要求 sel.register(sock, selectors.EVENT_READ, accept) ##參數fileobj,events,data=None(回調函數,或者數據) ''' 產生socket,就是有連接請求,傳給回調函數執行 sock,selectors.EVENT_READ說明socket和讀就緒后執行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等回調函數)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()?
轉載于:https://www.cnblogs.com/harden13/p/9203857.html
總結
以上是生活随笔為你收集整理的Python之io概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch环境准备(一)
- 下一篇: VS2015 将*.xaml.cs文件包