一張圖看懂同步、非同步與多執行緒的差別
· 預估閱讀時間: 5 分鐘
前言
同步、非同步和多執行緒的差別常常是面試的必考題之一。
應該也有很多人不只看過、用過,甚至已經寫到用起來像吃飯喝水一樣的自然。
但是,當遇到有人要求用比較淺顯易懂的方式來解釋這三者的差別時,我敢說,有很多人就是講不出來。
我幾乎敢這樣講,但我也不敢完全否認,還是有些人可以回答得出來。(喂!~)
同步、非同步和多執行緒的差別常常是面試的必考題之一。
應該也有很多人不只看過、用過,甚至已經寫到用起來像吃飯喝水一樣的自然。
但是,當遇到有人要求用比較淺顯易懂的方式來解釋這三者的差別時,我敢說,有很多人就是講不出來。
我幾乎敢這樣講,但我也不敢完全否認,還是有些人可以回答得出來。(喂!~)
之前有同事跑來問我,為什麼我們的 ASP.NET WebAPI 閒置一段時間之後,被呼叫的第一個 API 呼叫都會因為超時而失敗?
(這裡指的超時是呼叫端設定了兩秒沒收到回應就會直接當作超時處理)
而且很有趣的是,當把 Load Balancer 後面的伺服器移到只剩一台的時候,這個問題就不會發生。
一旦掛上兩台以上的機器,比較不那麼忙的那台就很容易重現這個問題。
當下我一開始很直覺的認為,應該是系統沒有作好預載(Preload)的動作,導致 Application Pool 被回收之後重啟的過程花費太多時間。
但是人生往往不是這麼簡單,在我們對系統加上預載相關設定之後,隔一段時間的第一個 API 呼叫都還是會超時。
經過一番抽絲剝繭 之後,才發現原來真兇是 MSDTC…