Asynchronous အကြောင်း သောင်းပြောင်းထွေလာ
What is Asynchronous Programming?
Asynchronous အကြောင်းပြောမယ်ဆိုရင် သူနဲ့ဆန့်ကျင်ဘက် synchronous အကြောင်းကစပြောမှ သင့်တော်ပါလိမ့်မယ်။ Synchronous ဆိုတာကတော့ အချိန်ကိုက်ဖြစ်တာလို့ ဘာသာပြန်ရပါလိမ့်မယ်။ ပုံမှန်အားဖြင့် ကျွန်တော်တို့ရဲ့ code တွေက line by line အလုပ်လုပ်ပါတယ်။ တစ်နည်းပြောရရင် synchronously အလုပ်လုပ်ပါတယ်။ ကျွန်တော်ဒီနေပြောမယ့် asynchronous ဆိုတာကတော့ တစ်ချိန်တည်းမှာ အလုပ်တွေအများကြီး လုပ်နိုင်တာကိုပြောတာပါ။ Asynchronous programming ကြောင့် non-blocking ဆိုတဲ့စကား ပေါ်ပေါက်လာတယ်ထင်ပါတယ်။ Node js တို့လို single-threaded language တွေမှာ non-blocking i/o mechanism ဖြစ်နေတာဟာ asynchronous ရဲ့ကျေးဇူးတွေကြောင့် ဖြစ်ပါတယ်။
TL;DR
ဒီ article က technical content ဆိုတာထက် ဒီအတိုင်း ကျွန်တော့်အတွေးကို ရောက်တတ်ရာရာ လျှောက်ရေးထားတာဖြစ်လို့ စာအရှည်ကြီး kind of article ဖြစ်ပါတယ်။
Analogy
Asynchronous ဆိုတာ စားသောက်ဆိုင်က စားပွဲထိုးတွေနဲ့ တော်တော်လေး ဆင်တူပါတယ်။ စားပွဲထိုးတွေဟာ အရင်ဆုံး စားသုံးသူဆီက order ကိုရေးမှတ်ပါတယ်။ ပြီးရင် စားဖိုဆောင်ကို order စာရွက် ပေးလိုက်ပါတယ်။ ပြီးရင်တော့ နောက်စားပွဲတစ်ခုကိုသွားပြီး ဘာမှာမလဲ သွားမေးပါတယ်။ ပထမစားပွဲက မှာထားတာရပြီဆိုတော့မှ အဲ့စားပွဲကိုသွားပြန်ချပေးပါတယ်။ မှာတာမရသေးမချင်း တစ်ခြားအလုပ်တွေကို လုပ်နေပါတယ်။ Asynchronous ဆိုတာလည်း ဒီသဘောပါဘဲ။ ဒီနေရာမှာ အဲ့စားပွဲထိုးကသာ table တစ်ခုမှာ မှာထားတာ မရမချင်း နောက် table ကိုမသွားဘူးဆိုရင် တော်တော် block ဖြစ်မှာပါဘဲ။ လာစားသူတွေကလည်း ပထမလူ မှာထားတာမရမချင်း ကိုယ်မှာလို့မရဘူးဆိုရင် တော်တော်စိတ်ဆိုးမှာပါဘဲ။ ဆိုင်ရှင်အနေနဲ့လည်း စားပွဲ ၄၀ ရှိရင် စားပွဲထိုး အယောက် ၄၀ ခန့်ထားရပါလိမ့်မယ်။
In real life
ကျွန်တော်တို့ software engineering မှာလည်း ဒီလိုပါဘဲ။ Facebook app ဟာ post တွေကို server ပေါ်ကနေ download လုပ်ပြီး list အနေနဲ့ ပြန်ပြပေးပါတယ်။ Post တစ်ခုမှာ ဓာတ်ပုံတွေ၊ စာတွေ၊ ဗီဒီယိုတွေ ပါနိုင်ပါတယ်။ Internet connection ကြောင့်ဘဲဖြစ်ဖြစ် network traffic ကြောင့်ဘဲဖြစ်ဖြစ် အကြောင်းအမျိုးမျိုးကြောင့် post တစ်ခုက ဓာတ်ပုံတို့၊ စာတို့ကို download လုပ်လို့မပြီးသေးမချင်း scroll လဲလုပ်လို့မရတော့ဘူး post ကိုလဲ like/share စတာတွေလုပ်လို့မရဘူး ဘာမှလဲနှိပ်လို့မရတော့ဘူးဆို တော်တော်ဖီးလ်အောက်မှာပါ။ အဲ့လိုနေရာတွေမှာ ခုနက စားပွဲထိုး analogy လိုမျိုး ဖြေရှင်းသွားပါတယ်။ အရင်ဆုံး app ကနေ text တွေ photo တွေကို download လုပ်ပါတယ်။ မပြီးသေးရင် မပြသေးဘဲ တစ်ခြား like လုပ်တာ share လုပ်တာ scroll လုပ်တာ စတဲ့ user interaction တွေကို handle လုပ်ပါတယ်။ Download လုပ်လို့ပြီးသွားပြီဆိုတော့မှ ဓာတ်ပုံတွေကို ပြန်ပြပေးပါတယ်။ ဒီနေရာမှာ download လုပ်တာပြီးသွားပြီဆိုတာမျိုး system ကိုပြန်ပြီး notify လုပ်နိုင်ဖို့ reactive programming ဆိုတာ ပေါ်လာပြန်ပါတယ်။ ပုံမှန်ကတော့ task တစ်ခု ပြီးသွားရင် data ပါလာလား fail သွားတာလားဆိုတာကို အလိုလို system ကိုပြန်ပြီး notify လုပ်ပေးပါတယ်။ ဒါပေမယ့် အဲ့လို data update ဖြစ်တိုင်း နောက်ကွယ်မှာ တစ်ခြားအလုပ်တွေကိုလုပ်နိုင်ဖို့ နောက်တစ်ခါ user ရဲ့ event တွေကို ပြန် react လုပ်နိုင်ဖို့ reactive programming ဆိုတာ ခေတ်စားလာတာပါ။ ReactiveX project လို့ခေါ်တဲ့ Rx family ဟာ အခုဆိုရင် language တော်တော်များများမှာရှိနေပါပြီ။
Language တွေအပေါ်မူတည်ပြီး asynchronous ကို handle လုပ်ပုံလုပ်နည်းတွေ ကွာပါတယ်။ JavaScript လို thread တစ်ခုတည်းပေါ်မှာ run တဲ့ language မှာဆိုရင် thread switch တွေ လုပ်ပြီး multi-threaded သဖွယ်ဖြစ်အောင် လုပ်ယူပါတယ်။ အဲ့တာကြောင့်ဘဲ JavaScript ဟာ non-blocking လို့ကြွေးကြော်ပြီး server-side မှာပါ အောင်မြင်တဲ့ language ဖြစ်လာတာဖြစ်ပါတယ်။ Thread တွေအကြောင်းကို နောက် article တစ်ခုနဲ့ ရေးသွားပါဉီးမယ်။ JavaScript မှာ အရင်တုန်းက promise တွေနဲ့ရေးခဲ့တဲ့ခေတ်ကနေ အခုဆိုရင်ရေးရတာ flat ဖြစ်တဲ့ async/await ခေတ်ကိုရောက်လာပါပြီ။ Promise ဆိုတာကတော့ callback ကိုခေါ်တဲ့ နောက်ထပ်အခေါ်အဝေါ်တစ်ခုဖြစ်ပါတယ်။ I promise that I’ll call you(function) as soon as I finished downloading/executing your task လို့ နားလည်နိုင်ပါတယ်။
Swift မှာဆိုရင် version 5.4 အထိမှာ callback function တွေနဲ့ရေးပါတယ်။ Function တွေဆိုတာ ခေါ်မှ အလုပ်လုပ် (execute) ပါတယ်။ Callback function ရဲ့သဘောကတော့ ဒီ function ကို နောက်တော့မှ ပြန်ခေါ်မယ်ဆိုတာမျိုး ဖြစ်ပါတယ်။ ဘယ်အချိန်မှပြန်ခေါ်မလဲဆိုတော့ long running task တစ်ခုကို အလုပ်လုပ်စေပြီး complete ဖြစ်သွားတော့မှ အဲ့ result ကို function parameter အနေနဲ့ထည့်ပေးပြီး အဲ့ function တွေကို system က ခေါ်ပေးတာဖြစ်ပါတယ်။ အဲ့ result ရရင် ဘာဆက်လုပ်မယ်ဆိုတာကို အဲ့ function ထဲမှာ ကြိုရေးပေးထားရပါတယ်။ Swift 5.5 မှာတော့ asynchronous programming ကို language level ကနေ support ပေးဖို့ proposal တွေတင်ထားပြီး အခုဆို beta အဆင့်ရောက်နေပါပြီ။
Asynchronous programming နဲ့အတူ multi-threading ဆိုတာတွေ ပေါ်လာပြန်ပါတယ်။ Reactive programming, pub/sub model, concurrent programming, multi-threading စတာတွေဟာ developer တွေအကြား ရေပန်းစားပြီး လူတိုင်းကြိုက်တဲ့ စားချင်စရာ နတ်သုဒ္ဓါတစ်ခုလိုဖြစ်နေပါတယ်။ ဒါပေမယ့် ကိစ္စတိုင်းမှာ ကောင်းတာရှိသလို ဆိုးတာလည်းရှိပါတယ်။ လုပ်ပိုင်ခွင့် ပိုမျိုးလာတာနဲ့အမျှ တာဝန်လည်း ပိုကြီးလာပါတယ်။ Race condition တွေ deadlocks တွေ shared states တွေနဲ့ပတ်သက်ပြီး proactive ဖြစ်ဖြစ်နဲ့ တာဝန်ယူဖြေရှင်းထားရမှာဖြစ်သလို တစ်ဖက်ကလည်း ကျွန်တော်တို့ရဲ့ step by step တွေးနေကျ ဉီးနှောက်ကို asynchronous ပုံစံအတိုင်းလိုက်တွေးနိုင်အောင် လေ့ကျင့်ထားရမှာဖြစ်ပါကြောင်း။
ကျွန်တော့်ရဲ့ article တွေကို သဘောကျနှစ်သက်တယ်ဆိုရင် ကျွန်တော့်ရဲ့ နောက်ထပ်လာမယ့် content တွေမလွတ်သွားအောင် follow လုပ်ထားပေးကြပါခင်ဗျာ။