علی آیتی
علی آیتی
خواندن ۲ دقیقه·۳ سال پیش

مقدمه ای بر برنامه نویسی آسنکرون

تصویر از koyeb.com
تصویر از koyeb.com


برای درک آسنکرون یا 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 ثانیه طول می کشد!

گرفتن اطلاعات از 10 منبع مختلف به صورت سنکرون
گرفتن اطلاعات از 10 منبع مختلف به صورت سنکرون

خروجی:

main.py executed in 6.93 seconds.

اما اگر همین کد با منطق آسنکرون نوشته شود، زمان اجرای برنامه به طرز چشم گیری کاهش می یابد. ماژول httpx یک ماژول مدرن برای وب با قابلیت پیشتیبانی از async است.

گرفتن اطلاعات از 10 منبع مختلف به صورت آسنکرون
گرفتن اطلاعات از 10 منبع مختلف به صورت آسنکرون

خروجی:

main.py executed in 1.91 seconds.

منابع

asyncprogrammingpythonبرنامه نویسیپایتون
مهندس کامپیوتر و برنامه نویس | علاقه مند به لینوکس و دنیای اوپن سورس | عاشق طبیعت و توسعه فردی
شاید از این پست‌ها خوشتان بیاید