由于CPU和內(nèi)存的速度遠(yuǎn)遠(yuǎn)高于外設(shè)的速度皮仁,所以,在IO編程中蝌数,就存在速度嚴(yán)重不匹配的問(wèn)題愕掏。舉個(gè)例子來(lái)說(shuō),比如要把100M的數(shù)據(jù)寫入磁盤顶伞,CPU輸出100M的數(shù)據(jù)只需要0.01秒饵撑,可是磁盤要接收這100M數(shù)據(jù)可能需要10秒剑梳,怎么辦呢?有兩種辦法:
第一種是CPU等著滑潘,也就是程序暫停執(zhí)行后續(xù)代碼垢乙,等100M的數(shù)據(jù)在10秒后寫入磁盤,再接著往下執(zhí)行语卤,這種模式稱為同步IO侨赡;
另一種方法是CPU不等待,只是告訴磁盤粱侣,“您老慢慢寫,不著急蓖宦,我接著干別的事去了”齐婴,于是,后續(xù)代碼可以立刻接著執(zhí)行稠茂,這種模式稱為異步IO柠偶。
同步和異步的區(qū)別就在于是否等待IO執(zhí)行的結(jié)果。好比你去麥當(dāng)勞點(diǎn)餐睬关,你說(shuō)“來(lái)個(gè)漢堡”诱担,服務(wù)員告訴你,對(duì)不起电爹,漢堡要現(xiàn)做蔫仙,需要等5分鐘,于是你站在收銀臺(tái)前面等了5分鐘丐箩,拿到漢堡再去逛商場(chǎng)摇邦,這是同步IO。
你說(shuō)“來(lái)個(gè)漢堡”屎勘,服務(wù)員告訴你施籍,漢堡需要等5分鐘,你可以先去逛商場(chǎng)概漱,等做好了丑慎,我們?cè)偻ㄖ悖@樣你可以立刻去干別的事情(逛商場(chǎng))瓤摧,這是異步IO竿裂。
很明顯,使用異步IO來(lái)編寫程序性能會(huì)遠(yuǎn)遠(yuǎn)高于同步IO照弥,但是異步IO的缺點(diǎn)是編程模型復(fù)雜铛绰。想想看,你得知道什么時(shí)候通知你“漢堡做好了”产喉,而通知你的方法也各不相同捂掰。如果是服務(wù)員跑過(guò)來(lái)找到你敢会,這是回調(diào)模式,如果服務(wù)員發(fā)短信通知你这嚣,你就得不停地檢查手機(jī)鸥昏,這是輪詢模式〗阒悖總之吏垮,異步IO的復(fù)雜度遠(yuǎn)遠(yuǎn)高于同步IO。
操作IO的能力都是由操作系統(tǒng)提供的罐旗,每一種編程語(yǔ)言都會(huì)把操作系統(tǒng)提供的低級(jí)C接口封裝起來(lái)方便使用膳汪,Python也不例外。我們后面會(huì)詳細(xì)討論P(yáng)ython的IO編程接口九秀。