شنبه , ۲۷ مرداد ۱۳۹۷

پردازش موازی با جاوااسکریپت

 

زمانی‌که از حرکت جهان به سمت وب و آنلاین شدن صحبت می‌کنیم و هنگامی که مرورگرها در حال تبدیل شدن به اصلی‌ترین پنجره رو به دنیای کامپیوتر هستند، برنامه‌هایی که در مرورگرها اجرا می‌شوند باید بتوانند از همه منابع سیستم برای فراهم کردن بالاترین کارایی و بهترین تجربه کاربری بهره گیرند. امروزه به دلیل نبودن مدل‌های برنامه‌نویسی موازی در وب، برنامه‌های تحت وب از تمامی مزایای پردازش موازی سخت‌افزارها استفاده نمی‌کنند. اگر برای برنامه‌های مدرن وب راهی وجود داشته باشد که بتوانند محاسبات سنگین خود را در پس‌زمینه انجام دهند و کاربر را وادار نکنند که منتظر پایان محاسبات بماند، بسیار بهتر کار کرده و کیفیت آن‌ها بالاتر خواهد رفت.

 

Web Workers
طبق تعریف کنسرسیوم جهانی وب، وب‌ ورکر (Web Worker) یک اسکریپت جاوا اسکریپت است که آغاز کار آن از یک صفحه HTML بوده و مستقل از سایر اسکریپت‌های واسط کاربر، که ممکن است در همان صفحه باشند، در پس‌زمینه اجرا می‌شود.
وب‌‌ورکرها یکی از ویژگی‌های توانمند جدا از HTML5 هستند که می‌توانند به همراه HTML5 به کار گرفته شوند. این فناوری که تا به امروز توسعه‌دهندگان چندان به آن توجه نکرده‌اند، یک API در اختیارتان قرار می‌دهد که با کمک آن می‌توانید اسکریپتی را در یک رشته پردازشی (thread) جداگانه اجرا کنید،‌ به گونه‌ای که در شیوه اجرا و کارکرد واسط کاربر برنامه شما اختلالی ایجاد نشود. این اسکریپت به طور موازی با مفسر واسط کاربر و اسکریپت‌های موجود در آن اجرا خواهد شد. به این ترتیب، در صورتی که در بخشی از برنامه شما به پردازش سنگینی نیاز داشته باشد، دیگر برنامه تا کامل شدن آن پردازش بدون پاسخ‌گویی (به اصطلاح فنی unresponsive) باقی نخواهد ماند و برنامه تا تکمیل شدن آن پردازش سنگین، کاربر را وادار به انتظار نخواهد کرد. با اجرای بخش‌های مختلف برنامه در رشته پردازشی مستقل، از پردازنده‌های مرکزی چندهسته‌ای به گونه‌ای کاراتر  استفاده خواهد شد.
وب‌‌ورکر یک اسکریپت زمان‌گیر است که با اجرای اسکریپت‌های واسط کاربر، در روند کار آن وقفه‌ای حاصل نمی‌شود. اسکریپت‌های واسط کابر آن دسته از اسکریپت‌هایی هستند که به کلیک‌ها و به طور کلی به تعاملات کاربر با برنامه پاسخ می‌دهند. باید توجه داشت زمانی‌که ورکرها در پس‌زمینه در حال اجرا هستند به DOM دسترسی مستقیم ندارند. اما با سند مربوطه از طریق تبادل پیام ارتباط برقرار می‌کنند. این امر امکان اجرای برنامه‌های چند‌رشته‌ای (multi-thread) جاوااسکریپت را فراهم می‌آورد. البته، همچون موجودیت‌های مربوط به برنامه‌نویسی چند‌رشته‌ای در سایر زبان‌ها، وب‌ورکرها اشیا سنگینی هستند و هر نمونه از آن‌ها بخش زیادی از منابع سیستم را در اختیار می‌گیرند. هزینه آغاز به کار و میزان مصرف حافظه آن‌ها نیز بالا است. از این رو، بهتر است از آن‌ها به تعداد زیاد در برنامه خود استفاده نکنید و در مقابل، برای اموری طولانی که به منابع حیاتی سیستم مثل پردازنده مرکزی، پهنای باند شبکه و غیره نیاز دارند، از آن‌ها استفاده کنید. در صورتی که مرورگر شما از وب‌ورکرها پشتیبانی می‌کند،

 

وب‌ورکرها در دو نوع اختصاصی و اشتراکی طبقه‌بندی می‌شوند. با استفاده از ورکرهای اشتراکی این امکان وجود خواهد داشت که چند برنامه وب با نمونه‌ای از یک ورکر اشتراکی ارتباط برقرار کند. ورکرهای اشتراکی با نام یا آدرس URL شناخته می‌شوند که هنگام ساخت به constructor آن ارسال کرده‌اید. ورکرها علاوه بر نسخه فعلی مرورگرهای فایرفاکس، کروم، سافاری، اپرا و نسخه 10 اینترنت اکسپلورر، در سافاری نسخه iOS و مرورگر آندروئید نسخه 2 و 2.1 پشتیبانی می‌شوند. (جدول1) البته مرورگر نسخه‌های بعدی آندروئید پشتیبانی از آن‌ها را لغو کرده است. جزئیات فنی کار با ورکرها در مقاله‌ای جداگانه شرح داده شده است که در صورت تمایل می‌توانید آن را نیز مطالعه کنید.

 

 

 

Parallel.js
برای پردازش چندهسته‌ای در جاوااسکریپت کتابخانه کوچکی به نام Parallel.js وجود دارد که با استفاده از توانایی‌های وب‌ورکرها نوشته شده و برنامه‌نویسی موازی در جاوااسکریپت را بسیار ساده کرده است. این کتابخانه که نسخه فشرده شده آن کم‌تر از 2 کیلوبایت حجم دارد، هم برای بهره‌گیری از امکانات پردازش موازی مرورگر در سمت کاربر و هم پردازش‌های فرزند Node.js در سمت سرویس‌دهنده قابل استفاده است.
به طور معمول با وب‌ورکرها شما باید یک اسکریپت جداگانه بنویسید و آن را در Worker thread ورکر بارگذاری کنید. این کار در برخی موارد، به‌ویژه زمانی که می‌خواهید از بخشی از کد هم در رشته اصلی و هم در ورکر استفاده کنید، چندان راحت و به اصطلاح راه‌دست نیست. کتابخانه Parallel.js با ارائه یک انتزاع زیبا، این مشکل را برای انجام امور معمول حل کرده است. این کتابخانه به شما امکان می‌دهد که از یک ورکر شامل یک یا چند تابع که به جای فایل جداگانه در رشته والد تعریف شده‌اند، نمونه‌سازی کنید. کافی است نام توابع و آرگومان‌های لازم برای فراخوانی تابع با آن‌ها را ارسال کنید. کتابخانه یک ورکر ساخته و تابع را با آرگومان‌های ارسالی فراخوانی می‌کند و در پایان، نتیجه را به صورت ناهمگام به رشته اصلی برمی‌گرداند.
همچنین یک واسط MapReduce برای پردازش مجموعه داده‌های بزرگ وجود دارد که داده را به بخش‌های مختلفی برای پردازش موازی با تعداد دل‌خواهی  Worker thread تقسیم می‌کند. زمانی که تمام پردازش‌ها تکمیل شد، نتایج با یکدیگر ادغام شده و به رشته اصلی برگردانده می‌شود. زمانی‌که برنامه‌های وب، بیش‌تر پردازش‌های خود را در سمت کاربر انجام می‌دهند، نیاز خواهیم داشت که از توانمندی‌های سیستم‌های چندهسته‌ای آن‌ها استفاده کنیم تا کار با برنامه رضایت‌بخش باشد و کاربران به دلیل آن‌که میزان زیادی پردازش در رشته اصلی انجام می‌شود، متوجه تأخیر یا توقفی در برنامه نشوند. وب‌ورکرها قابلیت‌های ارزشمندی هستند که البته کار با آن‌ها اندکی مشکل است و به واسطه Parallel.js می‌توانیم از تمامی مزایای آن‌ها به شکلی ساده و حتی لذت‌بخش بهره‌مند شویم.

Intel River Trail
پروژه منبع‌باز ریورتریل (River Trail)، که آزمایشگاه اینتل روی آن کار می‌کند، یک موتور جاوااسکریپت برای پردازش موازی است که به Parallel JavaScript نیز معروف شده است. هدف این پروژه آن است که امکان استفاده از توان محاسبات موازی سخت‌افزار را به شیوه‌ای ایمن و در چارچوب الگوهای برنامه‌نویسی جاوااسکریپت در اختیار توسعه‌دهندگان وب قرار دهد. ریورتریل امکانات جاوااسکریپت را به‌گونه‌ای گسترش می‌دهد که بتواند با استفاده از هسته‌های پردازنده مرکزی و دستورالعمل‌های برداری (SSE/AVX) آن در مقایسه با اجرای ترتیبی دستورهای جاوااسکریپت به افزایش سرعت بسیاری دست یابد. این کار تنها با اضافه شدن چند دستورالعمل، بدون این‌که هرگونه پیچیدگی به زبان جاوااسکریپت و برنامه‌نویسی با آن اضافه شود و برنامه‌نویس را درگیر پیچیدگی‌های برنامه‌نویسی چند‌رشته‌ای کند، انجام شده است. این پروژه که با HTML5، Canvas و WebGL به خوبی کار می‌کند از OpenCL به عنوان یک زبان میانی بهره می‌گیرد. بنابراین، استفاده از آن به سخت‌افزارهای اینتل منحصر نخواهد بود و روی سایر سخت‌افزارهایی که OpenCL قادر به برقراری ارتباط با آن‌ها است، قابل استفاده خواهد بود.
برندان ایچ سازنده زبان جاوااسکریپت و مدیر  فناوری بنیاد موزیلا که در گردهمایی توسعه‌دهندگان اینتل در سپتامبر 2011 (IDF 2011) برای معرفی ریورتریل حضور داشت، پس از این گردهمایی گفت که به شخصه تلاش خواهد کرد که این پروژه به عنوان بخشی از استاندارد اکمااسکریپت درآید.
امروز نیز در پیش‌نویس نسخه‌های 6 و 7 اکمااسکریپت، وجود آن به عنوان بخشی از استاندارد نسخه‌های آینده قطعی شده است. در حالت کلی برنامه‌نویسی موازی بر پایه ساختمان داده‌های موازی تعریف شده در آن شناخته می‌شود. در ریورتریل یک شی جدید به نام ParallelArray تمامی کارکردهای مورد نیاز را فراهم خواهد کرد. می‌توانید از ابتدا یک شی را با داده‌های اولیه دل‌خواه خود تعریف کنید و یا یک آرایه استاندارد مثل آرایه پیکسل‌های Canvas را به یک ParallelArray تبدیل کنید. زمانی که چنین شیئی را در اختیار داشته باشید می‌توانید با استفاده از متدهای موازی جدید یعنی map، reduce، combine، filter، scan، scatter، flatten، partition و get روی آن کار کنید. مسئولیت کارهایی همچون قفل کردن و همگام‌سازی که در برنامه‌نویسی موازی مطرح هستند به عهده سیستم است و در جای لازم به صورت خودکار انجام خواهد شد.
همان‌طور که می‌دانید WebGL پای گرافیک و انیمیشن‌های سه‌بعدی را به دنیای وب و مرورگرها باز کرده است. اما بدون پردازش موازی، حتی سریع‌ترین موتورهای پردازش ترتیبی جاوااسکریپت نیز قادر به تولید تصاویر گرافیکی با وضوح و کیفیت بالا نخواهند بود. با پردازش موازی همه چیز ممکن خواهد شد. در آزمایش انجام شده در همایش توسعه‌دهندگان اینتل (IDF 2011)، با استفاده از پردازش ترتیبی معمول سرعت تغییر یک انیمیشن 3 فریم در ثانیه بود. اما با استفاده از یک پیاده‌سازی 8 هسته‌ای از همان برنامه، سرعت تغییر این انیمیشن به 45 فریم در ثانیه افزایش یافت که نمایانگر افزایش سرعت 15 برابری بود. تصور کنید اگر بتوان از صدها هسته پردازشی موجود در کارت‌های گرافیکی در محیط وب نیز استفاده کرد، چه تحول عظیمی در دنیای بازی‌های آنلاین و همچنین نرم‌افزارهای پیشرفته آنلاین برای اجرای طراحی‌های گرافیکی، پردازش صوت و تصویر و پردازش‌های آماری، تحلیل‌های داده‌ای و سایر محاسبات پیچیده و سنگین رخ خواهد داد. در زمان نوشتن این مقاله ریورتریل به صورت استاندارد در مرورگرها وجود ندارد و برای استاندارد شدن آن ناچاریم تا انتشار نسخه جدید استاندارد اکمااسکریپت صبر کنیم. البته بنابر اعلام موزیلا، یک پیاده‌سازی از ریورتریل در آوریل 2013 به نسخه‌های Nightly Builds موتور جاوااسکریپت SpiderMonkey فایرفاکس اضافه شده است. اما اگر مرورگر شما از این فناوری پشتیبانی نمی‌کند و کنج‌کاو شده‌اید که نتایج برنامه‌نویسی موازی با جاوااسکریپت با استفاده از ریورتریل را با چشمان خود ببینید و برنامه‌های موازی دل‌خواه خود را توسعه دهید، می‌توانید آن‌را به عنوان یک افزونه از سایت github.com/rivertrail دریافت کرده و پس از اضافه کردن آن به مرورگر فایرفاکس خود، تجربه با آن را آغاز کنید.

با مطالعه راهنمای موجود در سایت ریورتریل، به شما اطمینان می‌دهیم که در صورت آشنایی با برنامه‌نویسی جاوااسکریپت، فراگیری کار با API آن بیش از یک ساعت به زمان نیاز نخواهد داشت.
البته، اگر از مرورگری غیر از فایرفاکس استفاده کنید یا حتی از فایرفاکس بدون افزونه ریورتریل استفاده کنید، شاهد افزایش سرعت در برنامه‌های این محیط نخواهید بود و اجرای کدهای آن به صورت ترتیبی معمول خواهد بود.
پس از انتشار استاندارد جدید اکمااسکریپت، بدون شک در سال‌های آینده شاهد خواهیم بود که همه مرورگرها بدون نیاز به نصب هیچ افزونه‌ای به صورت استاندارد از این مدل برنامه‌نویسی موازی پشتیبانی خواهند کرد.

منبع : ماهنامه شبکه

Print Friendly, PDF & Email

جوابی بنویسید

ایمیل شما نشر نخواهد شدخانه های ضروری نشانه گذاری شده است. *

*