python 管道 异步读取 select_python之异步select解析
一、I/O多路復用
I/O的含義:在計算機領域常說的IO包括磁盤IO和網絡IO,我們所說的IO復用主要是指網絡IO;在Linux中一切皆文件,因此網絡IO也經常用文件描述符FD來表示。
復用的含義:在通信領域中為了充分利用網絡連接的物理介質,往往在同一條網絡鏈路上采用時分復用或頻分復用的技術,使其在同一鏈路上傳輸多路信號,即公用某個“介質”來盡可能多的做同一類(性質)的事,在網絡場景中復用的“介質”就是任務處理線程,所以簡單理解就是多個IO共用1個線程。
I/O復用的好處:在傳統意義上,對于多線程并發的處理方式是,服務端監聽客戶端請求,也就是I/O流,每有一個I/O流進來,程序就創建一個線程處理這個I/O流,假設現在有一百萬個I/O流進來,那就需要開啟一百萬個線程一一對應處理這些I/O流,這樣CPU占有率很高,而且這些I/O流可能大部分時間只是連接著,沒有實際的數據讀寫,這也造成系統資源的浪費,所以人們提出了I/O多路復用這個模型,一個線程,通過記錄I/O流的狀態來同時管理多個I/O,可以提高服務器的吞吐能力。
因此就可以利用一個函數(select和poll)來監聽I/O所需的這些數據的狀態,一旦I/O有數據可以進行讀寫了,進程(也可以說是線程)就來對這樣的IO進行服務。
select,poll,epoll都是IO多路復用的機制,I/O多路復用就是通過一種機制,讓單個進程可以監視多個文件描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知應用程序進行相應的讀寫操作。
但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負責進行讀寫,異步I/O的實現會負責把數據從內核拷貝到用戶空間。
二、Python select
Python的select()方法直接調用操作系統的IO接口,它監控sockets,open files, and pipes(所有帶fileno()方法的文件句柄)何時變成readable 和writeable, 或者通信錯誤,select()使得同時監控多個連接變的簡單,并且這比寫一個長循環來等待和監控多客戶端連接要高效,因為select直接通過操作系統提供的C的網絡接口進行操作,而不是通過Python的解釋器。
select()方法接收并監控3個通信列表, 第一個是所有的輸入的data,即外部發過來的數據,第2個是所有要發出去的data,第3個監控錯誤信息。需要創建2個包含輸入和輸出信息列表來傳給select(),列表里是服務端和客戶端socket對象。
程序的主循環,調用select()時會阻塞和等待直到新的連接和數據進來。
當你把inputs,outputs,exceptional(這里跟inputs共用)傳給select()后,它返回3個新的list,我們上面將他們分別賦值為readable,writable,exceptional,?所有在readable list中的socket連接代表有數據可接收(recv),所有在writable list中的存放著你可以對其進行發送(send)操作的socket連接,當連接通信出現error時會把error寫到exceptional列表中。
原文:https://www.cnblogs.com/zlw-xyz/p/12950535.html
總結
以上是生活随笔為你收集整理的python 管道 异步读取 select_python之异步select解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商ELLE联名信用卡使用指南:时尚女性
- 下一篇: docker访问宿主机mysql_doc