برای درک آسنکرون یا Async فرض کنید تابعی برای انجام کارش باید منتظر گرفتن نتیجه از یک تابع دیگر بماند. در حالت عادی کل جریان (Thread) برنامه متوقف (Block) می شود اما اگر در زمان انتظار، جریان برنامه را بسپاریم به یک وظیفه (Task) دیگر، بهره وری بهتری نخواهیم داشت؟
برنامه نویسی آسنکرون لزوما به معنای افزایش بازدهی یا performance نیست! بلکه فقط تعداد تسک ها یا به عبارت دیگر توان عملیاتی (throughput) برنامه افزایش می یابد.
برنامه نویسی آسنکرون، برنامه نویسی multi-thread محسوب نمی شود و این دو موضوع کاملا متفاوت هستند. یک برنامه می توان در کنار single-thread یا multi-thread بودنش سنکرون یا آسنکرون باشد.
قطعه کد زیر را در نظر بگیرید:
همانطور که دیده می شود تابع count سه بار باید اجرا شود و خود تابع count به تابع sleep وابسته است و باید منتظر بماند کارش تمام شود. بنابراین خروجی چیزی شبیه زیر خواهد بود و حدود سه ثانیه طول میکشد تا برنامه به اتمام برسد.
One Two One Two One Two countsync.py executed in 3.01 seconds.
اما اگر همین زمان انتظار برای تابع sleep صرف انجام کار دیگری شود (به عنوان مثال تابع count برای بار دوم اجرا شود و...) بهره وری برنامه افزایش خواهد یافت. با برنامه نویسی آسنکرون قطعه کد بالا به صورت زیر نوشته می شود:
در کد فوق، هنگام انتظار برای تابع sleep تابع بعدی که مجددا همان count می باشد صدا زده می شود و نتیجه به صورت زیر خواهد بود. (ترتیب خروجی ها را مقایسه کنید) دقت کنید اجرای این برنامه تنها حدود 1 ثانیه زمان برده است. چیزی حدود یک سوم کد قبلی.
One One One Two Two Two countasync.py executed in 1.01 seconds.
یکی از سناریو های متداول، ارسال درخواست های HTTP متعدد و کار کردن با اطلاعات دریافتی هست. در قطعه کد زیر قرار است فقط 10 درخواست HTTP فرستاده شود و نتایج آن در یک دیکشنری ذخیره شود. اجرا این کد در حالت عادی حدود 6 ثانیه طول می کشد!
خروجی:
main.py executed in 6.93 seconds.
اما اگر همین کد با منطق آسنکرون نوشته شود، زمان اجرای برنامه به طرز چشم گیری کاهش می یابد. ماژول httpx یک ماژول مدرن برای وب با قابلیت پیشتیبانی از async است.
خروجی:
main.py executed in 1.91 seconds.