လွယ်လွယ်ပြောရင် async/await ဆိုတာ program က တစ်ခုခု (ဥပမာ internet ကနေ data ဆွဲတာ) ကို စောင့်နေရတဲ့အချိန်မှာ ထိုင်စောင့်မနေဘဲ တခြားအလုပ် ဆက်လုပ်နိုင်အောင် ရေးတဲ့ နည်းလမ်းပါ။ တစ်ယောက်တည်း အလုပ်များများ တစ်ပြိုင်နက် ကိုင်တွယ်နိုင်တဲ့ လျှို့ဝှက်ချက်ပဲ။
ကြက်ဥပြုတ်နေတုန်း တခြားဟင်း ချက်တဲ့ ဥပမာနဲ့ ပြောရအောင်။ ကြက်ဥပြုတ်ဖို့ ၁၀ မိနစ် စောင့်ရတယ်။ သာမန် program ဆိုရင် မီးဖိုရှေ့ ၁၀ မိနစ် ရပ်စောင့်နေတာ — ပြီးမှ နောက်တစ်ခု လုပ်တယ်။ async program ကျတော့ ကြက်ဥအိုးတင်ပြီး timer ထားခဲ့တယ်၊ အဲဒီအချိန်မှာ ဟင်းသီးဟင်းရွက် လှီးတယ်၊ timer မြည်မှ ပြန်လာပြီး ကြက်ဥဆယ်တယ်။ စောင့်ရတဲ့ အချိန်ကို အလကား မဖြုန်းဘူး။
တကယ့် code နဲ့ ကြည့်ရအောင်။ Website ၃ ခုကနေ data ဆွဲမယ်ဆို သာမန်နည်းက တစ်ခုပြီးမှ တစ်ခု — စုစုပေါင်း ၉ စက္ကန့် ကြာတယ်။
import asyncio, aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as s:
async with s.get(url) as r:
return await r.text()
async def main():
urls = ["https://a.com", "https://b.com", "https://c.com"]
results = await asyncio.gather(*(fetch(u) for u in urls))
asyncio.gather က request ၃ ခုလုံးကို တစ်ပြိုင်နက် လွှတ်တယ်။ တစ်ခုက server တုံ့ပြန်တာ စောင့်နေတုန်း ကျန်တဲ့ နှစ်ခုက သူ့အလုပ် သူလုပ်နေတယ်။ စုစုပေါင်း ၃ စက္ကန့်လောက်ပဲ ကြာတယ် — ၃ ဆ မြန်သွားတယ်။
ဒီမှာ async ဆိုတာ “ဒီ function က စောင့်ရမယ့် အလုပ် ပါတယ်နော်” လို့ ကြေညာတာ။ await ဆိုတာ “ဒီနေရာမှာ ရလဒ် စောင့်ရမယ်၊ ဒါပေမယ့် စောင့်နေတုန်း တခြား async အလုပ် လုပ်လို့ရတယ်” လို့ ပြောတာ။ အရေးကြီးတာက — await မပါတဲ့ သာမန် function ခေါ်ရင် program က တကယ် ရပ်စောင့်သွားတယ်၊ မြန်ဆန်မှု အကျိုးမရဘူး။
ဘယ်အချိန် သုံးသင့်လဲ —
API တွေ၊ database တွေ၊ file တွေကို စောင့်ရတဲ့ I/O များတဲ့ အလုပ်မှာ သုံး — ဒါက async ရဲ့ အားသာချက်အကြီးဆုံး
တွက်ချက်မှု သက်သက်များတဲ့ အလုပ် (ဓာတ်ပုံ process လုပ်တာ၊ video encode လုပ်တာ) မှာတော့ သိပ်အကျိုးမရှိ — အဲဒါမျိုးကျ multiprocessing ဒါမှမဟုတ် thread သုံး
JavaScript မှာ fetch().then() နဲ့ await fetch() က ဒီသဘောပါပဲ — browser ထဲက async ရဲ့ နေ့စဉ်ပုံစံ
FastAPI လို modern web framework တွေက async ကို အခြေခံထားလို့ request ထောင်ပေါင်း တစ်ပြိုင်နက် ကိုင်နိုင်တာ
သတိထားရမှာက async က thread မဟုတ်ဘူး။ တစ်ချိန်တည်းမှာ အလုပ် တစ်ခုပဲ တကယ် run နေတာ — ဒါပေမယ့် စောင့်ဆိုင်းချိန်တွေကို လိမ္မာပါးနပ်စွာ ဖြည့်ထားလို့ မြန်နေသလို ခံစားရတာ။ စာရေးဆရာတစ်ယောက် စာအုပ် ၃ အုပ် တစ်ပြိုင်နက် ရေးနေသလိုမျိုး — တစ်အုပ်ကို စိတ်ကူးစောင့်နေတုန်း နောက်တစ်အုပ် ရေးတယ်။
ကိုယ့် program က internet စောင့်ရတာများပြီး နှေးနေရင် async/await က ပထမဆုံး စဉ်းစားသင့်တဲ့ လက်နက်ပဲ။ စောင့်ရတဲ့ အချိန်ကို အလကား မဖြုန်းနဲ့ — ကြက်ဥပြုတ်နေတုန်း ဟင်းလှီးထားလိုက်။ 🙂