由於CPU和內存的速度遠遠高於外設的速度,所以,在IO編程中,就存在速度嚴重不匹配的問題。舉個例子來說,比如要把100M的數據寫入磁盤,CPU輸出100M的數據只需要0.01秒,可是磁盤要接收這100M數據可能需要10秒,怎麼辦呢?有兩種辦法:
第一種是CPU等着,也就是程序暫停執行後續代碼,等100M的數據在10秒後寫入磁盤,再接着往下執行,這種模式稱爲同步IO;
另一種方法是CPU不等待,只是告訴磁盤,“您老慢慢寫,不着急,我接着幹別的事去了”,於是,後續代碼可以立刻接着執行,這種模式稱爲異步IO
同步和異步的區別就在於是否等待IO執行的結果。
異步的好處是程序性能高,缺點是編程模型複雜。
想看,你得知道什麼時候通知你“漢堡做好了”,而通知你的方法也各不相同。如果是服務員跑過來找到你,這是回調模式,如果服務員發短信通知你,你就得不停地檢查手機,這是輪詢模式。總之,異步IO的複雜度遠遠高於同步IO
好比你去麥當勞點餐,你說“來個漢堡”,服務員告訴你,對不起,漢堡要現做,需要等5分鐘,於是你站在收銀臺前面等了5分鐘,拿到漢堡再去逛商場,這是同步IO。
你說“來個漢堡”,服務員告訴你,漢堡需要等5分鐘,你可以先去逛商場,等做好了,我們再通知你,這樣你可以立刻去幹別的事情(逛商場),這是異步IO。
9.1 文件讀寫
#!/usr/bin/python
poem = '''\
1.dog
2.cat
3.rabbit
'''
f=file('/tmp/poem','w')
f.write(poem)
f.close()
#輸出文件內容,方法一
#f=open('/tmp/poem','r')
#for line in f.readlines():
# print(line.strip())
#f.close()
#輸出文件內容,方法二
f=file('/tmp/poem')
while True:
line = f.readline()
if len(line)==0:
break
print(line.strip())
f.close()
寫文件
寫文件和讀文件是一樣的,唯一區別是調用open()函數時,傳入標識符'w'或者'wb'表示寫文本文件或寫二進制文件:
>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()
你可以反覆調用write()來寫入文件,但是務必要調用f.close()來關閉文件。當我們寫文件時,操作系統往往不會立刻把數據寫入磁盤,而是放到內存緩存起來,空閒的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤。忘記調用close()的後果是數據可能只寫了一部分到磁盤,剩下的丟失了。所以,還是用with語句來得保險:
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
用close()的兩個好處
1.關閉開啓的文件數
2.確保內存中的數據寫入硬盤
f.flush() 不用關閉文件就可以將內存中的內容寫入到硬盤
小結
在Python中,文件讀寫是通過open()函數打開的文件對象完成的。使用with語句操作文件IO是個好習慣。