pfx در برنامه نویسی موازی در دات نت
در این ویدئو به بررسی PFX میپردازیم. PFX یک کتابخانهای است که توسط Microsoft به .Net اضافه شده برای برنامهنویسی موازی. با استفاده از این کتابخانه، ما به راحتی میتوانیم از برنامهنویسی موازی استفاده کنیم بدون اینکه درگیر پیچیدگیهای thread ها شویم، و تمرکز اصلی ما روی business اپلیکیشنمان باشد. این کتابخانه به ما امکان میدهد به راحتی از امکانات برنامهنویسی موازی استفاده کنیم.
اما چرا میخواهیم از برنامهنویسی موازی استفاده کنیم؟ تا قبل از سال 2004، CPUهایی که برای کامپیوترها ساخته میشدند روز به روز قویتر میشدند. CPUها تکهستهای بودند و برنامهای که در آن زمان قویتر میشد نیازی نبود تغییری در نحوه کدنویسی آن ایجاد شود. چرا؟ چون CPUها قویتر میشدند و برنامهها به راحتی میتوانستند از قدرت CPUهای جدید بهرهبرداری کنند و با performance بالاتر انجام دهند.
اما از سال 2004 به بعد به دلیل مشکلاتی که وجود داشت، دیگر نمیتوانستند CPUها را بزرگتر کنند و از راهکار جدیدی استفاده کردند. شرکتهایی که در ساخت پردازنده فعالیت داشتند، به جای اینکه CPUها را قویتر و بزرگتر کنند، هستههای بیشتری به CPUها اضافه کردند و از سال 2004 به بعد CPUهای چندهستهای ارائه شدند.
زمانی که CPUچرا اپلیکیشنهای وب به صورت پیشفرض از CPUهای چند هستهای بهرهبرداری میکنند؟ به این دلیل که این برنامهها طوری طراحی شدهاند که هر درخواستی که از کاربر به سرور میرسد، در یک نخ (thread) جداگانه اجرا میشود. این باعث میشود که بدون نیاز به تغییر کد، اپلیکیشنهای وب بهرهبرداری کنند. اما در مورد برنامههای تحت دسکتاپ مانند Windows Forms، این برنامهها به صورت یکنخی ایجاد میشوند و برای بهرهبرداری از تمام تواناییهای CPUهای چند هستهای، باید برنامهنویسی موازی انجام دهند.
در مورد برنامهنویسی وب، هر درخواست کاربر به صورت پیشفرض در یک نخ جداگانه پردازش میشود. اما در بخش پشتصحنه، هنگامی که به لایهی اپلیکیشن میرسیم، ممکن است کارهایی باشد که باید به صورت موازی انجام شوند. به عنوان مثال، علاوه بر نخهایی که به صورت جدا برای هر کاربر ساخته میشوند، شما خودتان نیاز دارید که نخهای بیشتری ایجاد کنید و کارهای یک درخواست کاربر را به صورت موازی انجام دهید. پس برنامهنویسی موازی نه تنها مختص برنامههای دسکتاپ است بلکه میتوان برای وب اپلیکیشنها نیز از آن استفاده کرد.
برای انجام برنامهنویسی موازی، دو راهکار وجود دارد: Data Parallelism و Task Parallelism. در Data Parallelism، دادهها به چند بخش تقسیم میشوند و هر بخش دریک نخ یا یک هسته CPU انجام میشود. به عنوان مثال، فرض کنید لیستی از 100 هزار کاربر دارید و میخواهید برای همهی آنها ایمیل ارسال کنید. میتوانید دادههای کاربران را به چندین بخش تقسیم کرده و هر بخش را به یک نخ واگذار کنید تا به صورت موازی ایمیلها را ارسال کنند.
اما در Task Parallelism، کارهای مختلف را جدا میکنیم و هر کدام را در یک تسک (task) جداگانه انجام میدهیم. به عنوان مثال، فرض کنید در یک پروژه بعد از ثبت سفارش، میخواهید چند کاری که به هم ربطی ندارند انجام دهید. مثلا ارسال پیامک به کاربر، ارسال ایمیل به مدیریت، ثبت اطلاعات در نرمافزار CRM، ثبت اطلاعات در نرمافزار حسابداری و غیره. در این مورد، از روش Data Parallelism نمیتوانید استفاده کنید زیرا لیستی از دادهها ندارید که بتوانید آنها را تقسیم کنید و به هر هسته CPU بدهید. در اینجا به جای آن، تسکهای خود را تقسیم میکنید، یعنی هر کار را در یک تسک جداگانه قرار میدهید.
با استفاده از این دو روش، میتوانید برنامهنویسی موازی را انجام دهید. روش Data Parallelism راحتتر است زیرا شما یک داده دارید و میخواهید یک کار مشخص را روی آن انجام دهید. سپس به راحتی داده را به قطعات کوچکتری تقسیم کرده و هر بخش را به یک هستهی CPU واگذار میکنید تا کار را برای شما انجام دهد.اما در Task Parallelism، ما باید منطق برنامه یا همان Business Logic را تقسیمبندی کنیم و هر بخش را در یک task اجرا کنیم. Task Parallelism پیچیدگی بیشتری دارد و کمی سختتر از Data Parallelism است، زیرا باید منطق برنامه را در task های مختلف اجرا کنیم و هر بخش را به یک thread یا هسته CPU واگذار کنیم. در مقابل، در Data Parallelism میآییم و دادههایمان را تقسیم میکنیم که خیلی راحتتر است. حالا به سراغ PFX میرویم که این دو کار را برای ما به راحتی انجام میدهد؛ یعنی این دو روش موازیسازی را در PFX داریم. PFX از دو بخش تشکیل شده است:
1- Task Parallel Library (TPL)
2- Parallel LINQ (PLINQ)
از TPL برای Task Parallelism که معرفی کردیم، استفاده میکنیم. یعنی اگر بخواهیم منطق برنامه را به taskهای مختلف تقسیم کنیم و همه اینها را به صورت موازی اجرا کنیم، از TPL استفاده میکنیم. و اگر بخواهیم Data Parallelism داشته باشیم، یعنی لیستی از دادهها را داریم و میخواهیم آنها را تقسیم کنیم و یک عملیاتی را بر روی آنها توسط هستههای مختلف CPU انجام بدهیم، از Parallel LINQ یا PLINQ استفاده میکنیم. Parallel LINQ نسخه موازی دستورات LINQ است، یعنی ما میتوانیم از همان دستورات LINQ استفاده کنیم، اما به صورت موازی.
نکتهای که در این مورد وجود دارد این است که ما برای LINQ to XML و LINQ to Object میتوانیم به صورت موازی استفاده کنیم. اما LINQ to SQL را نمیتوانیم به این شکل استفاداده کنیم، زیرا دستورات LINQ به T-SQL ترجمه شده و روی SQL Server اجرا میشوند که قابلیت موازی اجرا شدن را ندارند. از PLINQ برای LINQ به Object و LINQ به XML میتوانیم استفاده کنیم و بهترین کاربردش همان LINQ به Object است که میتوانیم به صورت موازی Data Parallelism را بر روی لیستی از آبجکتهای خود داشته باشیم. بخش TPL شامل 6 کلاس است که میتوانیم برای Task Parallelism از آنها استفاده کنیم:
1- Task
2- Task<TResult>
3- TaskFactory
4- TaskCompletionSource
5- TaskScheduler
6- Parallel
ما میدانیم که Task بخشی از کتابخانه PFX است که جزء TPL محسوب میشود و برای برنامهنویسی موازی Task Parallelism از آن استفاده میکنیم. میتوانیم با استفاده از کلاسهای فوق Task Parallelism را پیادهسازی کنیم. PLINQ بر روی دستورات LINQ اجرا میشود بدون اینکه نیاز باشد ما کار اضافهای انجام دهیم و فقط با صدا زدن یک متد میتوانیم Data Parallelism را داشته باشیم. PLINQ در پسزمینه از TPL استفاده میکند. با استفاده از PFX میتوانیم حداکثر استفاده از پردازندهها را ببریم. الگوریتمهایی استفاده شدهاند که به صورت خودکار تشخیص میدهند چند thread و در چه زمانی استفاده کنند و همیشه بهینهترین حالت را در اختیار ما قرار میدهند. از طرفی، برنامهنویسی موازی را بسیار سادهتر انجام میدهیم و درگیر پیچیدگیهای Multithreading نمیشویم، و در نتیجه خطاها و باگهای کمتری در برنامههای ما ایجاد میشوند.
در نتیجه، استفاده از PFX و تکنیکهای Task Parallelism و Data Parallelism موجب میشود که برنامههای ما کارایی بیشتری داشته باشند و بهتر بتوانند از منابع سیستم بهرهبرداری کنند. همچنین، استفاده از این کتابخانه باعث سادهتر شدن برنامهنویسی موازی میشود و میتواند به کاهش احتمال خطاها و مشکلات ناشی از چند نخی کردن کمک کند.بال نمایند، میتوانند با استفاده از کتابخانه PFX و تکنیکهای Task Parallelism و Data Parallelism برنامههای خود را کارآمدتر و بهینهتر کنند. استفاده از این کتابخانه و تکنیکها در طولانیمدت به بهبود عملکرد و کارایی برنامهها کمک میکند و همچنین زمان توسعه را کاهش میدهد.
در نتیجه، به برنامهنویسان توصیه میشود که برای یادگیری کامل سیشارپ و بهرهبرداری بهتر از امکانات و کتابخانههای این زبان، در دوره "ستارگان سیشارپ" شرکت کنند. این دوره به شما کمک میکند تا دانش و مهارتهای خود را در زمینه برنامهنویسی سیشارپ تقویت کرده و به عنوان یک برنامهنویس حرفهای در این زمینه شکوفا شوید.