• بخش 3 – Node.JS ، معرفی - Asynchronous
بخش 3 – Node.JS ، معرفی - Asynchronous
1395/03/11 - 00:16:02 // Node.js // 1 نظر // 4237 بازدید

Node.js در یک thread منفرد رویداد حلقه اجرا شده و با قدرت فراخوانی غیرهمزمان می تواند کارهای مختلفی انجام دهد . کارهایی مانند عملیات I/O . درست در هنگامی که زبان های برنامه نویسی دیگر یک تقاضای دیتابیسی ارسال می کنند و منتظر نتیجه ی آن هستند ، Node.js این انتظار را نخواهد کشید و هنگامی که تقاضای دیتابیس ارسال شد ، Node.js به اجرای ادامه ی کدهای بعد از آن خواهد پرداخت و هنگامی که نتیجه آماده شد به آن تقاضا بازخواهد گشت .

بخش 3 Node.JS ، معرفی - Asynchronous

Node.js در یک thread منفرد رویداد حلقه اجرا شده و با قدرت فراخوانی غیرهمزمان می تواند کارهای مختلفی انجام دهد . کارهایی مانند عملیات I/O . درست در هنگامی که زبان های برنامه نویسی دیگر یک تقاضای دیتابیسی ارسال می کنند و منتظر نتیجه ی آن هستند ، Node.js این انتظار را نخواهد کشید و هنگامی که تقاضای دیتابیس ارسال شد ، Node.js به اجرای ادامه ی کدهای بعد از آن خواهد پرداخت و هنگامی که نتیجه آماده شد به آن تقاضا بازخواهد گشت .

این یک مفهوم بسیار سودمند خواهد بود ، اما گاه و بیگاه نیاز به کار بیشتر در End خواهد داشت تا بتوانید از این موقعیت بهره ببرید .

برنامه نویسی غیرهمزمان

در برنامه نویسی های قدیمی اکثر عملیات I/O بصورت همزمان اتفاق می افتاد . اگر شما به زبان جاوا فکر کنید و بیاندیشید که چگونه می توانستید یک فایل را بخوانید ، با کدی مشابه زیر روبرو می شوید :

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

اگر شما عملیات قفل کننده ی بیشتری داشته باشید وضعیت از این هم بدتر خواهد شد .

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

برای حل این مشکل که مشاهده کردید Node.js مدل برنامه نویسی غیرهمزمان یا asynchronous را ارائه داده است .

I/O غیرهمزمان در واقع یک فرم از ورودی خروجی می باشد که به سایر پروسه ها اجازه ی ادامه فعالیت را قبل از پایان پروسه ی جاری خواهد داد .

در مثال زیر یک نمونه از خواندن فایل را توسط Node.js با هم بررسی می کنیم . در هر دو حالت همزمان و غیر همزمان شما از بلاک شدن ادامه ی کار نرم افزار خودداری می کنید .

در روش همزمان کد خواندن فایل در Node.js بصورت زیر خواهد بود :

در اینجا چه اتفاقی افتاده است ؟ ما یک فایل را توسط ماژول همزمان fs می خوانیم . انتظار می رود که متغیر content شامل محتویات فایل file.md باشد . مشکل آنجاست که برای رسیدن به این هدف Node.js باید تا رسیدن به اتمام عملیات بلاک شود . و بدان معناست که تا زمان خوانده شدن فایل فعالیت دیگری قابل انجام نخواهد بود .

حال ببینیم که چطور می شود این مشکل را مرتفع کرد .

برنامه نویسی غیرهمزمان asynchronous همانگونه که در جاوا اسکریپت می شناسیم تنها با استفاده از first-class ها در آن زبان قابل انجام خواهد بود . آن ها می توانند مانند سایر متغیرها در بین توابع جابجا و پاسکاری شوند . توابعی که می توانند به عنوان آرگومان سایر توابع مورد استفاده قرار بگیرند به عنوان توابع high-order شناخته می شوند .

یکی از مثال های ساده و آسان در زمینه ی توابع high-order بصورت زیر می باشد :

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

فراخوانی های so-called error-first در قلب Node.js بوده که ماژول های هسته از آن مانند اکثر ماژول های موجود در NPM استفاده می کند .

نکته ی قابل توجه در اینجا این است که :

· Error-handling : بجای استفاده از try-catch شما نیاز به بررسی خطاها دارید

· بدون مقدار برگشتی : متدهای غیرهمزمان مقداری را برنمی گردانند اما مقادیر در callback ها پاسکاری می شوند .

حال کمی تمرین بالا را تغییر می دهیم :

خروجی اسکریپت بالا بصورت زیر خواهد بود :

همانگونه که می بینید ما یکبار شروع به خواندن فایل کرده و سپس اجرا ادامه خواهد یافت و نرم افزار مقدار end of the file را چاپ خواهد کرد .

Event Loop

حلقه ی رویداد Event Loop قلب Node.js بوده و مسئول زمانبندی کردن عملیات غیرهمزمان می باشد .

قبل از اینکه بطور عمیق تر وارد مسئله شویم اجازه دهید تا با مفهوم برنامه نویسی رویداد محور event-driven بیشتر آشنا شویم .

برنامه نویسی رویداد محور Event-Driven یک الگوی برنامه نویسی می باشد که جریان برنامه با رویدادهایی مانند فعالیت های کاربر ( کلیک ماوس ، فشردن کلید ) ، سنسورهای خروجی ، یا پیامی از برنامه ای یا thread دیگر مشخص می گردد .

در واقع مشخص می کند که نرم افزار براساس رویداد فعالیت خواهد نمود .

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

شاد و سلامت باشید

محمد جعفری فوتمی

محمد جعفری فوتمی
معرفی نویسنده : محمد جعفری فوتمی

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

امتیاز به مطلب
           
نظرات کاربران
  • saeed
    1396/01/01 - 02:04:57

    0
    0
    سپاس از آموزش خوبتون.
ارسال نظر