Python學習筆記__20章 異步IO

# 這是學習廖雪峯老師python教程的學習筆記python

1、概覽web

CPU的速度遠遠快於磁盤、網絡等IO。網絡

    1)同步IO多線程

一旦遇到IO操做,如讀寫文件、發送網絡數據時,就須要等待IO操做完成,才能繼續進行下一步操做,在IO操做的過程當中,當前線程被掛起,而其餘須要CPU執行的代碼就沒法被當前線程執行了。併發

由於同步IO的緣由,咱們必須使用多線程或者多進程來併發執行代碼,爲多個用戶服務。每一個用戶都會分配一個線程,若是遇到IO致使線程被掛起,其餘用戶的線程不受影響app

因爲咱們要解決的問題是CPU高速執行能力和IO設備的龜速嚴重不匹配,多線程和多進程只是解決這一問題的一種方法異步

do_some_code()ide

f = open('/path/to/file', 'r')oop

r = f.read() # <== 線程停在此處等待IO操做結果學習

# IO操做完成後線程才能繼續執行:

do_some_code(r)

    2)異步IO

當代碼須要執行一個耗時的IO操做時,它只發出IO指令,並不等待IO結果,而後就去執行其餘代碼了。一段時間後,當IO返回結果時,再通知CPU進行處理

異步IO模型須要一個消息循環,在消息循環中,主線程不斷地重複「讀取消息-處理消息」這一過程

loop = get_event_loop() # 建立一個事件loop

while True:

    event = loop.get_event() # get_event() 獲取外部事件

    process_event(event) #處理事件

當遇到IO操做時,代碼只負責發出IO請求,不等待IO結果,而後直接結束本輪消息處理,進入下一輪消息處理過程。當IO操做完成後,將收到一條「IO完成」的消息,處理該消息時就能夠直接獲取IO操做結果

 

在異步IO模型下,一個線程能夠同時處理多個IO請求,而且沒有切換線程的操做。對於大多數IO密集型的應用程序,使用異步IO將大大提高系統的多任務處理能力。

相關文章
相關標籤/搜索