大家好,我是小風哥。
之前很多同學在微信上問能不能講講異步編程是怎么一回事兒,今天就和大家簡單聊一聊這個話題。
我們以函數調用為例,假設有這樣的代碼:
void B() { lines = read(filename); sum(lines);}void A() { ... B(); ...}
代碼非常簡單,B函數讀取一個文件,文件里保存的是一行行數據,然后加和,A函數中的某個位置調用B函數。
此時,我們說這是同步調用,因為A函數后續代碼必須等待B函數處理完文件才能繼續執行。
隨著業務不斷發展,B函數處理的文件越來越龐大,此時處理一次文件耗時2小時,假設A函數后還有一行重要的代碼:
void A() { ... B(); something_important(); ...}
這就意味著調用B函數后需要等待2個小時才能執行到something_important這行代碼,而something_important函數對時間要求非常苛刻,該怎樣改進呢?
其實很簡單,我們可以在B函數內部創建一個線程,在線程中處理文件:
void handle_file() { lines = read(filename); sum(lines);}void B() { thread t(handle_file);}void A() { ... B(); something_important(); ...}
這樣B函數被調用后創建完線程即可立即返回,緊接著開始執行something_important這行代碼,CPU在執行something_important這行代碼時可能文件還沒有開始處理,這樣函數A不再依賴于文件處理,這時我們說函數B函數就是異步調用的,函數A異步于文件處理。
如果是在單核系統下,CPU會不斷在處理文件線程和A函數線程間切換,看上去這兩個線程就好像在同時運行,但如果是在多核系統下,這兩個線程可以真正的并行起來。
在編程語境下,異步往往和線程進程等相關。
最后舉一個例子。
同步就好比你排隊去自助售票機取電影票(話說小風哥已經很久很久沒有去電影院看電影了),你必須排隊等待前一個人取完電影票才能到你,你不能在前一個取票的過程中取自己的票,這時我們說取電影票時你和前一個人是同步的。
而異步就好比去吃大餐,你在座位上看菜單點菜,其它人也可以點菜,你不需要等待其它人吃完飯才能下單,這時我們說你點菜和其它人吃飯是異步的。
好啦,這篇就到這里,希望對大家有所幫助。
本文鏈接:http://www.www897cc.com/showinfo-26-76519-0.html徹底理解異步編程!你理解了嗎?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com