iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

前言

  • 在前面的章回中,曾經提到過 async 與 await 的語法,會另外寫一篇來解釋。
  • 剛好在這禮拜,工作中遇到的某個同事,非常鄙夷某個程式語言,指其效能低落,進而勾起我的好奇心。情境是,那位仁兄想要在連續的一段時間內,發送請求進行服務的壓力測試。
  • 簡單地說就是做出一個可以測試 C10K 的請求端
  • 通常會這樣講的人是兩種情況
    • 一種是對於該程式碼瞭若指掌、徹底把玩的高手。
    • 另一種是使用了不好的語法或習慣來開發程式。
  • 原來這個仁兄採取的是透過「Multithreading」的方式進行...

我的觀點

  • 那位大大的假設中有些不好的作法謬誤存在
    • 意圖使用數百個 Thread 佔據運算資源。
    • 這些 Threads 用了極短的時間就運作到「送出請求」的動作,卻花相對冗長的時間在「等待伺服器」回覆內容。

    好比是某個投資理財顧問公司,寄信做市場調研。 (調研好像是詐騙集團用語 XD)
    而本次接收到的工作是要做大量的市場調研。
    原本一位員工寫好釣魚信花了1分鐘、寄出給民眾等待上鉤等了10小時。
    這些等待的時間,就是在電腦前發呆 9小時59分鐘,並沒有妥善使用。
    老闆覺得這樣工作太沒有效率了,所以又多找了一百位員工...

  • 其中大部分的時間都被花在等待⋯⋯
  • 在多花錢請更多員工之前,建議先改善工作流程:寄出信的時候,先不原地等待、先去做其他事情(例如:多寄幾封信)

情境

  • Swift 中,透過 asyncawait 的語法,來實現 「非同步」 這個先去做別件事情的行為。
  • 在程式碼中的 function 日益增多,會發現其中花了不少時間在等待資料下載、透過網路傳送密碼驗證身份過程中的等待時間,那會導致不好的使用者體驗
  • async 指的便是執行某函式時,過程中間設有一些暫離點,使在運行到 await 語法後,主程序可以暫時切換去做別的事情。
  • 以去便當街買下午茶為例,要買店員會學貓叫的飲料店的飲料,又要買老闆臉很跩的鹽酥雞。

使用同步執行

  • 走路去飲料店 5 分鐘、點飲料 1 分鐘、等飲料做好 3 分鐘、回程 5 分鐘,買好飲料花了 14 分鐘
  • 再次走出門走去鹽酥雞攤 5 分鐘、點餐 1 分鐘、等肉炸好 7 分鐘、被老闆問要不要加辣要不要切和結帳花 2 分鐘、回程 5 分鐘,買好炸雞花了 20 分鐘
  • 完成買下午茶的動作,費時 34 分鐘,中間花了一堆時間在等待別人完成工作、自己什麼都不能做。

使用非同步執行

  • 一邊思考鐵人賽的內容一邊走路去便當街花費 5 分鐘,先去點炸雞花了 1 分鐘,轉身到隔壁飲料店點餐病等飲料做好,等飲料做好的期間滑了一下手機,也是花了 1 + 3 分鐘,回到炸雞店前面繼續滑手機再多等 3 分鐘,就來到後續結帳階段 2 分鐘,回程一邊走路一邊分心也是花了 5 分鐘,共計 20 分鐘,過程中你充分地有效運用等待時間做了其他事情。

結論

  • 在單一一次的事件中,若存在較長的等待 I/O 時間,將行為切割後,找出支援 await (可暫離) 的函式呼叫。
  • 在主執行緒迴圈中重複被呼叫的 async 函式中,會在執行到 await 時,將其後面所承接的函式交給 Dispatch Queue 接手,並且在 await 後函數尚未運行完畢時,繼續原本主執行緒的運作,即不造成主執行緒的閉塞。

參考資料


上一篇
【Day 11】 Amplify Storage: Using AWS S3 Storage Plugin
下一篇
【Day 13】 更新套件後、那個 Trailing closure 語法產生的問題探討
系列文
依然無法成為釣魚大師也要努力摸魚!!辣個吃魚神器 APP 第二彈33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言