اصول Coroutines | Coroutines برای تازه کارها
کتابخانه coroutines از جمله کتابخانه های مهم و حرفه ای در زبان برنامه نویسی کاتلین است که باعث می شود دیگه نیاز به استفاده از Thread نباشد و باعث انعطاف پذیر شدن برنامه ها می شود. در این آموزش قصد داریم با کتابخانه coroutines آشنا شده و با مفاهیم کلی آن آشنا شویم.
چرا باید از coroutines استفاده کنیم؟
در ابتدا اجازه دهید بررسی کنیم چرا باید نمونه ای (instance) از Thread، را Coroutines قرار دهیم؟ . تفاوت اساسی بین Thread و Coroutines چیست؟ و چرا می خواهیم از instance آن در Thread استفاده کنیم؟
Threadها، هزینه بر هستند (resource intensive).
مشکل اصلی Threadها ، هزینه بر بودن آنهاست. به دلیل اینکه منابع زیادی برای راه اندازی یک Thread ، توقف یک Thread ، هماهنگی بین Threadها و غیره نیاز است. در حالی که Coroutines ، Threadهای بسیار بسیار کم حجم(lightweight) هستند.
Coroutine ها، Thread های کم حجمی هستند
برنامه ای داریم که در آن میلیون ها Coroutines را start می کنیم و هیچ مشکلی در حافظه نداریم ولی اگر سعی کنید که آن برنامه را با هزاران Thread راه اندازی کنید ، برنامه شما از حافظه خارج می شود و از کار می افتد (crash). اما Coroutineها بسیار کم حجم هستند بنابراین می توانید هر چه قدر دوست دارید بدون هیچ گونه مشکلی وoverhead ،آنها را start کنید.
ساده سازی کدهای async ، callback و synchronization
در حال حاضر باعث ساده سازی کدهای async می شوند ، بنابراین استفاده از callback و synchronization در Coroutine بسیار آسان است و در واقع آنها برنامه نویسی موازی (parallel programming) را همانند برنامه نویسی ترتیبی (sequential programming) می کنند.
بنابراین می توانید کد Coroutine را استارت کرده و بلافاصله به متغیرها و متدهای برنامه خود بدون هیچ گونه overhead دسترسی پیدا کنید. و به همین راحتی می توان از Coroutine به برنامه خود callback زده و همچنین synchronization هم بسیار مفید خواهد بود. فقط شما 2 یا 3 متد دارید که می توانید بدون overhead بین Coroutineها همگام سازی (synchronize) ایجاد کنید.
در جایی که اگر تا به حال با Thread کار کرده باشید می دانید که چه سردردی می تواند ایجاد کند ، به ویژه زمانی که تعداد زیادی از آنها را start می کنید ، همگام سازی بین آنها نیاز خواهد بود.
Coroutine ، syntax پیش پا افتاده ی بسیار ساده ای دارد. بنابراین آنها مفاهیمی (concept) دارندکه بسیار خوب با هم هماهنگ هستند و هنگامی که این مفهوم را درک کردید ، استفاده از آنها برای راه اندازی Coroutine و اجرای موازی کد بسیار آسان است. در حال حاضر آنها می توانندpause و resume در هر زمان شوند و یک coroutine به یک Thread محدود نخواهد بود.
یک Thread مکانی ساده برای اجرای coroutine است ، اما خود coroutine را می توان در هر زمان متوقف کرد و در هر زمان راه اندازی مجدد کرد.
بنابراین از این نظر حجم بسیار کمی دارند و می توان هر زمان که در صورت تمایل از آنها استفاده مجدد کنید.
مفاهیم اساسی Coroutine
- Scope
Scope ، coroutines را ایجاد و اجرا می کند. همچنین رویداد lifecycle را فراهم می کند ، بنابراین مواردی مانند توقف coroutine و لغو coroutine ، توسط یک Scope انجام می شود.
- Context
در حال حاضر Context مفهومی است که بسیار با scope گره خورده است. بنابراین scope خود Context ای را فراهم می کند و Context صرفاً state (حالت) coroutine است. اساساً ، تعدادی متغیر و تعدادی به صورت functionality ارائه می دهد که می توانید از آنها در coroutine خود استفاده کنید.
- Suspending functions (تعلیق functionها)
توابعی هستند که می توانند در coroutine اجرا شوند یا به اصطلاح آنها را معلق کنیم. بنابراین اساساً آنها عملکردی را ارائه می دهند که از آنها برای اجرای موازی استفاده می کنید.
- Jobs
یک Job اساساً Handle یک coroutine است و می توانید از یک Job برای دسترسی به متدهای چرخه زندگی (LifeCycle) یک coroutine استفاده کنید. خوب وقتی یک coroutine را به روش خاصی ایجاد می کنید در بعدا خواهیم دید که Job ، coroutine را لغو می کند
- Deferred
اساساً یک call teamاست که نتیجه را برمی گرداند ، اما اجرای coroutineرا به صورت موازی ارسال می کند. نمی توانید بلافاصله نتیجه را برگردانید. فقط زمانی می توان نتیجه را برگرداند که coroutine اجرای خود را به پایان رسانده باشد.
بنابراین ما به Deferred نیاز داریم، که آینده نتیجه یک coroutine است و اساساً به برنامه بگویید که منتظر نتیجه آن coroutine باشید زمانی که در نقطه ای هستید که به آن نتیجه نیاز دارید .
- Dispatchers
Dispatcherها تعداد مشخصی از thread ها را مدیریت می کنند و هر زمان که یک coroutine نیاز به اجرا داشته باشد ، آن را به یک thread اختصاص می دهد و به موقع آن thread خاص را اجرا می کند.
- Error handling (مدیریت خطا)
اساساً راهی برای رسیدگی به هر گونه خطایی که ممکن است در یک coroutine رخ دهد را ارائه می دهد.
نتیجه گیری
بنابراین ، اینها مفاهیم اصلی coroutine هستند. هنگامی که ایده اصلی coroutine را درک کردید. به راحتی می توانید همه این مفاهیم را اجرا کرده و عملکرد(functionality) مورد نیاز خود را به شما ارائه دهیم.
دیدگاهتان را بنویسید