理解同步和異步


async await解析同步異步操作
理解同步和異步:
假設一個服務器只有一個單線程每次只能處理一個請求
場景模擬:
廚房有一個廚師,很多客人都在點鯽魚湯
鯽魚湯流程:
1、前期准備,殺魚,准備輔料(3分鍾)
2、燒開水(12分鍾),假設每次只能燒一個菜的開水用量
3、煎魚加開水沖白...起鍋(5分鍾)
說明:1,2過程可以交換
假設現在是同步操作:
同步的特點就是在執行一個任務時,直至任務完成不能有其他操作。
所以一共需要20分鍾。
假設有3個客人同時點這個菜,總共需要60分鍾。
如果是異步操作呢?大家都知道燒開水這個工作,在我們加水到熱水壺以后按下開關,后面直至水燒開都不需要我們認為參與了,燒開也會自動斷開。
同步要求在等待燒水的過程中廚師不能干其他事,只能等待,這個等待的狀態被稱為線程阻塞。
異步則允許線程在等待執行結果返回前做其他操作
在一個請求內異步(controller內部異步)
廚師可以先燒水之后,馬上做步驟1,,所以步驟1,2,只需要12分鍾。
那么一道菜總共只需要17分鍾。
三道菜一共是51分鍾。

這就完了嗎?大家一定覺得還有優化空間吧,上述的情況是我在處理第一單的時候,是不能處理第二單的,就是說每個點單之間還是同步的,這樣也無法做到效率最大化

現實廚房一個廚師也不會三個菜要51分鍾吧。
那最快的當然是能同時做三個菜,也就是說我們響應請求也要是異步的,不用非得一個菜做好再做第二個菜。
也就是一個線程可以異步處理請求(controller層級設置成異步)
大致流程是這樣的:
廚師接到三個菜點單,先拿三個水壺燒水(12分鍾),燒水的過程中做好三條魚的准備工作。然后進行三條魚的制作(15分鍾),總共27分鍾。這也是貼合實際廚房場景的情況。






燒水這個流程這個可以類比為我們做一個數據庫耗時查詢,我們把sql提交給mysql數據庫,耗時的查詢在mysql端完成后返回,在此期間不需要我們參與了。我們可以把






其實不需要我們參與了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM