پردازش موازی یا خطی در جاوا اسکریپت ، مسئله این است!(قسمت سوم)

همانطور که از قسمت های اول و دوم متوجه شدیم:

زبان جاوا اسکریپت همانطور که گفته شد یک زبان Signle Thread می باشد. بدین معنی که تمامی عملیات ها در یک نخ توسط خود زبان کنترل می شوند.

اما دلیل اینکه این زبان به صورت تک نخ طراحی شده چیست؟

این امر برپایه نظریه ای است که می گوید این چنین فرایندی کیفیت و سرعت پردازش را نسبت به چند نخی افزایش می دهد.  زیرا به عنوان مثال در نخ ها می بایست کنترل محیط را نیز انجام داد ، مانند اینکه دو نخ به یک متغیر در یک زمان دسترسی نداشته باشند و ….

اما ایده ناهمزمانی در این زبان باعث می شود این مشکلات کاملا برطرف شود و تماما ، کنترل بر عهده زبان باشد.

با این حال به مرور زمان با پیشرفت زبان و قدرت طراحی اپلیکیشن ها ، نیاز به پردازش موازی در جاوا اسکریپت احساس شد و برای جلوگیری از تغییر در اساس زبان ، دست به طراحی API برای این زبان زدند.

نام این اینترفیس Web Worker می باشد.

ایده پس این رابط ، اجرای چندین اپلیکیشن به صورت موازی می باشد. با این رابط ، زبان جاوا اسکریپت به یک زبان Multi Thread تبدیل شد.

اما این رابط دارای ضعف هایی نیز می باشد. اولین ضعف این است که کدهای اجرایی از طریق این رابط دسترسی به document و window ندارند.

دومین ضعف این است که نمی توان کد را به صورت مستقیم ، به عنوان مثال یک تابع را ، با این رابط در نخ دیگر اجرا کرد. البته تکنیک ها و کتابخانه های Third-party وجود دارد که این فرایند را ممکن می سازند.

اما چگونه ممکن است که در زبانی که همچنان در یک نخ اجرا می شود ، یک رابط برای پردازش Multi thread وجود داشته باشد؟

برای درک بهتر به عکس زیر توجه نمایید:

درصورتی که به عکس توجه نمایید متوجه دو قسمت می شوید. موتور جاوا اسکریپت و مرورگر.

همانطور که پیداست ، ورکر ها در سمت مرورگر ایجاد شده اند.

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

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

ورکر ها ، فقط می توانند یک فایل را اجرا کنند و پاسخ آن را به عنوان یک پیام به جاوا اسکریپت ارسال کنند.ارسال و دریافت پیام دو طرفه می باشد. یعنی فقط تنها راه ارسال مقدار به فایل از طریق استفاده از  تابع postmessage می باشد که در فایل می بایست از طریق رویداد onmessage آن را شنود کرد. این فرایند برای دریافت در سمت جاوا اسکریپت نیز اتفاق می افتد.

این رابط تنها راهی می باشد که می توان یک اپلیکیشن را با زبان جاوا اسکریپت به صورت Multi thread اجرا کرد.

 اجرای همزمان ورکر هیچ تداخلی با اجرای عادی روند جاوا اسکریپت ندارد و همانطور که در عکس مشاهده می شود پس از اتمام فرایند ورکر ، پاسخ به صف Event Loop ارسال می شود و برای پردازش به صورت مستقل عمل می نماید.

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

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

منابع برای مطالعه بیشتر درباره ورکر ها:

۱ – Using Web Workers

۲ – Worker API



دسته بندی: مقاله

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *