စားသောက်ဆိုင်တစ်ဆိုင်ကို မြင်ယောင်ကြည့်ပါ။
စားဖိုမှူးတစ်ယောက်ပဲ ရှိတယ်ဆိုပါစို့။ သူက ထမင်းကြော်တစ်ပွဲ အော်ဒါရရင် ဒယ်အိုးထဲ ထမင်းထည့်၊ ကြော်၊ နူးအောင်စောင့်၊ ပြီးမှ ပန်းကန်ထဲထည့်ပြီး ပေးတယ်။ အဲ့ဒီ "နူးအောင်စောင့်" နေတဲ့အချိန်မှာ သူက ဘာမှမလုပ်ဘဲ ဒယ်အိုးကိုပဲ စိုက်ကြည့်နေတယ်။ နောက်ထပ် Customer တစ်ယောက် ထပ်လာရင်တောင် ပထမတစ်ပွဲပြီးမှ သူက အော်ဒါလက်ခံတယ်။ ဒါကို Blocking လို့ ခေါ်ပါတယ်။
အခု စားဖိုမှူးက async စားဖိုမှူး ဖြစ်သွားပြီ။
async: စားဖိုမှူးက "ငါက တစ်ခုခုကို စောင့်နေရင်း နောက်အလုပ်တစ်ခုကို လုပ်နိုင်တယ်" လို့ ကြေညာလိုက်တာပါ။await: သူက ထမင်းကို မီးဖိုပေါ်တင်လိုက်ပြီ။ ဒါပေမဲ့ ထမင်းနူးဖို့ ၅ မိနစ်စောင့်ရမယ်။ အဲ့ဒီမှာ သူက ဒယ်အိုးရှေ့မှာ ရပ်မစောင့်တော့ဘဲawait(စောင့်ဆိုင်းခြင်း) လုပ်ငန်းစဉ်ကို စတင်လိုက်တယ်။- The Magic: သူ စောင့်နေတဲ့ ၅ မိနစ်အတွင်းမှာ နောက် Customer တစ်ယောက်ဆီက အော်ဒါသွားယူတယ်၊ ဒါမှမဟုတ် ဟင်းသီးဟင်းရွက်တွေ လှီးနေတယ်။ ထမင်းနူးပြီဆိုတဲ့ အချက်ပေးသံကြားမှ သူက ဒယ်အိုးဆီ ပြန်လာပြီး အလုပ်ကို အဆုံးသတ်တယ်။
Python (FastAPI) နဲ့ ဥပမာပြရရင် ဒီလိုရှိပါတယ်။
import asyncio
# ၁။ 'async' က ဒီ function ဟာ အချိန်ယူရမယ့် အလုပ်တွေ ပါနိုင်တယ်လို့ ပြောတာ
async def make_coffee():
print("ကော်ဖီစဖျော်ပြီ...")
# ၂။ 'await' က ကော်ဖီစက်ထဲက ရေပွက်အောင် စောင့်နေတာ
# ဒီအချိန်မှာ Program က တခြားအလုပ် (ဥပမာ-ပေါင်မုန့်ကင်တာ) ကို သွားလုပ်နိုင်တယ်
await asyncio.sleep(3)
print("ကော်ဖီ ရပါပြီ!")
async def make_toast():
print("ပေါင်မုန့် ကင်ပြီ...")
await asyncio.sleep(2)
print("ပေါင်မုန့် ရပါပြီ!")
async def main():
# အလုပ်နှစ်ခုလုံးကို တစ်ပြိုင်တည်း စခိုင်းလိုက်တာ
await asyncio.gather(make_coffee(), make_toast())
asyncio.run(main())async def: Function တစ်ခုကို Asynchronous ဖြစ်အောင် ပြောင်းလိုက်တာပါ။ သူက Standard Function မဟုတ်တော့ဘဲ "Coroutine" တစ်ခု ဖြစ်သွားပါတယ်။await: ဒီနေရာမှာ အချိန်ယူရမယ် (ဥပမာ- Database က အချက်အလက်တောင်းတာ၊ API Call လုပ်တာ) လို့ ပြောတာပါ။awaitကိုasyncfunction ထဲမှာပဲ သုံးလို့ရပါတယ်။
အမြဲတမ်း async သုံးဖို့ မလိုပါဘူး။ ဒီလိုအခြေအနေမျိုးတွေမှာပဲ သုံးသင့်ပါတယ်:
- I/O Bound အလုပ်များ:
- Database ထဲက Data ဆွဲထုတ်ခြင်း။
- တခြား Website တစ်ခုကနေ API နဲ့ အချက်အလက်လှမ်းတောင်းခြင်း။
- File တွေ အကြီးကြီး ဖတ်ခြင်း/ရေးခြင်း။
- Concurrency လိုအပ်တဲ့အခါ: User ပေါင်းများစွာက တစ်ပြိုင်တည်း Request လုပ်နေတဲ့ Web Server မျိုးမှာ တစ်ယောက်ချင်းစီကို တန်းစီမစောင့်ခိုင်းချင်တဲ့အခါ သုံးပါတယ်။
အကယ်၍ သင်က await လုပ်ဖို့ မေ့သွားရင် ဒါမှမဟုတ် async မဟုတ်တဲ့ function ထဲမှာ အချိန်အကြာကြီးယူရတဲ့ အလုပ်တွေ (CPU heavy tasks - ဥပမာ image processing) ထည့်ထားရင် စားဖိုမှူးက တခြားအလုပ်လုပ်ခွင့်မရဘဲ တစ်ဆိုင်လုံး Stuck ဖြစ်သွားတတ်ပါတယ်။
အနှစ်ချုပ်:
async ဆိုတာ "ငါ့အလုပ်က အချိန်ယူရမယ်၊ ဒါပေမဲ့ ငါ့ကို စောင့်နေစရာမလိုဘူး၊ တခြားဟာ သွားလုပ်နေလို့ရတယ်" လို့ ပြောတာဖြစ်ပြီး await ကတော့ "အိုကေ၊ အဲ့ဒီအလုပ်ပြီးမှ ငါ ဒီကိစ္စကို ဆက်ကိုင်မယ်" လို့ တာဝန်ပေးလိုက်တာပါ။