IO編程
IO在計算機中指Input/Output,也就是輸入和輸出。由於程序和運行時數據是在內存中駐留,由CPU這個超快的計算核心來執行,涉及到數據交換的地方,通常是磁盤、網絡等,就需要IO接口。
比如你打開瀏覽器,訪問新浪首頁,瀏覽器這個程序就需要通過網絡IO獲取新浪的網頁。瀏覽器首先會發送數據給新浪服務器,告訴它我想要首頁的HTML,這個動作是往外發數據,叫Output,隨后新浪服務器把網頁發過來,這個動作是從外面接收數據,叫Input。所以,通常,程序完成IO操作會有Input和Output兩個數據流。當然也有只用一個的情況,比如,從磁盤讀取文件到內存,就只有Input操作,反過來,把數據寫到磁盤文件里,就只是一個Output操作。
IO編程中,Stream(流)是一個很重要的概念,可以把流想象成一個水管,數據就是水管里的水,但是只能單向流動。Input Stream就是數據從外面(磁盤、網絡)流進內存,Output Stream就是數據從內存流到外面去。對於瀏覽網頁來說,瀏覽器和新浪服務器之間至少需要建立兩根水管,才可以既能發數據,又能收數據。
由於CPU和內存的速度遠遠高於外設的速度,所以,在IO編程中,就存在速度嚴重不匹配的問題。舉個例子來說,比如要把100M的數據寫入磁盤,CPU輸出100M的數據只需要0.01秒,可是磁盤要接收這100M數據可能需要10秒,怎么辦呢?有兩種辦法:
第一種是CPU等着,也就是程序暫停執行后續代碼,等100M的數據在10秒后寫入磁盤,再接着往下執行,這種模式稱為同步IO;
另一種方法是CPU不等待,只是告訴磁盤,“您老慢慢寫,不着急,我接着干別的事去了”,於是,后續代碼可以立刻接着執行,這種模式稱為異步IO。
同步和異步的區別就在於是否等待IO執行的結果。好比你去麥當勞點餐,你說“來個漢堡”,服務員告訴你,對不起,漢堡要現做,需要等5分鍾,於是你站在收銀台前面等了5分鍾,拿到漢堡再去逛商場,這是同步IO。
你說“來個漢堡”,服務員告訴你,漢堡需要等5分鍾,你可以先去逛商場,等做好了,我們再通知你,這樣你可以立刻去干別的事情(逛商場),這是異步IO。
很明顯,使用異步IO來編寫程序性能會遠遠高於同步IO,但是異步IO的缺點是編程模型復雜。想想看,你得知道什么時候通知你“漢堡做好了”,而通知你的方法也各不相同。如果是服務員跑過來找到你,這是回調模式,如果服務員發短信通知你,你就得不停地檢查手機,這是輪詢模式。總之,異步IO的復雜度遠遠高於同步IO。
操作IO的能力都是由操作系統提供的,每一種編程語言都會把操作系統提供的低級C接口封裝起來方便使用,Python也不例外。我們后面會詳細討論Python的IO編程接口。
作者:php新手小白
鏈接:https://www.jianshu.com/p/8fb6d43a6692
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。