Introduction on Concurrency in .NET
همانطور که قبلا هم بیان کردم یکی از Concern ها و چالش های مهم در طراحی API Getaway بحث Reactive programming بودن Getaway طراحی شده می باشد. با توجه به misconceive هایی که معمولا موجب گرفتار شدن توسعه دهنده ها و طراحان می شوند؛ در اینجا به مفاهیم مرتبط به همزمانی و مفاهیم و عبارت مرتبط با این concept در دات نت بر اساس کتابی با همین نام از آقای Stephan Cleary پرداخته شده.
قبل از هر چیز باید تعریفی از خود کلمه همزمانی یا Concurrency داشته باشیم.
Concurrency
Doing more than one thing at a time.
همانطور که از توضیح بالا مشخص می باشد concurrency یعنی چند عمل و اقدام را بتوان همزمان انجام داد. مزیت های concurrency میتواند کاملا واضح بوده و نیازی به توضیح نداشته باشد. برنامه ای که در حال تعامل با کاربر می باشد تمایل داره در حالی که کاری مثلا پردازش یک فایل یا نوشتن در دیتابیس را انجام می دهد بتواند به سایر درخواست های کاربر پاسخ بدهد. یک برنامه وب هم مثلا میخواهد در حالی که در حال پردازش درخواست فعلی کاربر است بتواند درخواست بعدی کاربر را دریافت و پردازش کند. بطور خلاصه هر زمان که نیاز به این باشد که درحالی که درخواست فعلی را پردازش میکنیم درخواست بعدی را بتوانیم پردازش کنیم، به concurrency نیاز خواهیم داشت.
واژه بعدی که همیشه با concurrency اشتباه گرفته می شود، multithreading می باشد.
Multithreading
A form of concurrency that uses multiple threads of execution.
Multithreading یعنی استفاده از چندین thread جهت پردازش یک عمل. Multithreading یکی از روش های concurrency می باشد. استفاده از thread های سطح OS جهت اجرای همزمان چند دستور که یکی از روش های پیاده سازی concurrency می باشد .Multithreading بر روی thread pool که مکانیزم برای queue کردن کارها و اجرای این دسته کارها هست، قرار دارد. به این صورت که کارها ابتدا queue شده و سپس thread pool که یک task scheduler محسوب میشود بر اساس منابع در دسترس و الگوریتم های پیاده سازی اقدام به پخش کردن این کارها بین thread ها میکند.
Thread pool همچنین منجر به نوع دیگری از concurrency بنام parallel processing می شود
Parallel Processing
Doing lots of work by dividing it up among multiple threads that run concurrently.
Parallel Processing یا Parallel Programming سعی می کند با استفاده از multithreading استفاده از CPU را به حداکثر برساند. CPU های جدید دارای هسته های بیشتری هستند و اگر و در صورتی که کارهای زیادی برای اجرا وجود داشته باشد بکار گرفتن فقط یک هسته چندان معقول نمی باشد. Parallel processing کارها را بین چندین thread که ممکن است بین چندین core پخش شده باشند توزیع می کند.
پس بطور خلاصه تا به اینجا باید گفت parallel processing یک نوع از multithreading و multithreading هم نوعی از concurrency میباشد.
نوع دیگر concurrency که برای توسعه دهنده ها بیشتر آشنا میباشد Asynchronous programming می باشد.
Asynchronous Programming
A form of concurrency that uses futures or callbacks to avoid unnecessary threads.
یک feature یا promise یک تایپی هستند که عملیاتی رو بیان می کند که قرار است بعدا به اتمام برسد. نوع های جدید Task و Task<T> بیانگر این نوع دیتا تایپ هستند.
Asynchronous programming بر پایه Asynchronous operations بنا نهاده شده. Asynchronous operations بیانگر عملیات یا operation هایی است که شروع شده و مدتی بعد (نا مشخص) به اتمام می رسد. در حالی که operation در حال پردازش است. Thread جاری متوقف نمی شود. و وقتی که عملیات به اتمام رسید operation سعی می کند threadای که باعث شروع آن عملیات شده را باخبر کند
همانطور که احتمالا حدس زده اید Asynchronous programming در عمل میتواند با چالش های پیاده سازی زیادی مواجه شد. دو عبارت کلیدی async/await سعی در تسهیل پیاده سازی این نوع از concurrency در برنامه های modern را بر عهده دارند.
Reactive programming هم فرم دیگری از concurrency می باشد. در Asynchronous programming بیان کردیم که برنامه عملیاتی را شروع می کند که مدتی بعد به پایان می رسد. Reactive programming بسیار شبیه به Asynchronous programming می باشد با این تفاوت که این فرم برنامه نویسی بر پایه asynchronous event ها و نه asynchronous operation ها بنا نهاده شده است.
Asynchronous event ها ممکن است بر خلاف asynchronous operation ها در یک زمان خاص شروع نشوند و و همچنین ممکن است چندین و چندین بار raise شوند.
Reactive Programming
A declarative style of programming where the application reacts to events.
اگر بتوان برنامه را به عنوان مجموعه ای از حالت های مختلف در نظر گرفت می توان رفتار برنامه را به شکل یک state machine در نظر گرفت.که به event های با update کردن State خود واکنش یا reaction نشان می دهد.