درباره ند

هدف ند، بدست دادن راهی ساده برای ساخت برنامه های قابل گسترشِ تحت شبکه است. در مثال وب سرور "Hello World" که در بالا از نظر گذشت، تعداد زیادی از کانکشن ها به طور همزمان قابل پردازش اند. ند ( از طریق epoll، kqueue، /dev/poll، یا select ) به سیستم عامل فرمان می دهد که هر زمان کانکشن جدیدی ایجاد شد، وی را باخبر سازد. سپس به حالت sleep می رود. اگر اتصال جدیدی برقرار شد، سیستم عامل callback را صدا می زند. هر کانکشن در واقع تنها یک اختصاص دهی کوچکِ Heap است.

این روش با مدلهای همزمانی (concurrency) کنونی که در آن از Thread های سیستم عامل استفاده می شود متفاوت است. برنامه های تحت شبکه که بر پایه Thread ها ایجاد می شوند ناکارآمد و برای استفاده، پیچیده اند. اینجا و اینجا را ببینید. ند در استفاده بهینه از حافظه تحت فشارهای بالا نسبت به سیستم هایی که برای هر کانکشن ۲ مگابایت thread stack اختصاص می دهند، بسیار بهتر عمل می کند. گذشته از این، کاربرانِ ند دیگر نگرانی در مورد dead-lock ها ندارند—هیچ قفلی وجود ندارد. بعلاوه هیچ دستوری در ند مستقیماً کار I/O را انجام نمی دهد، بنابراین پردازه هیچگاه بلاک نمی شود. و چون هیچ چیزی بلاک نمی شود برنامه نویسان غیر حرفه ای هم می توانند سیستم های پرسرعتی بنویسند.

ند در طراحی تحت تأثیر و بسیار شبیه سیستم هایی نظیر Event Machine رابی و یا Twisted پایتن (Python) است. ند مدل رویدادگرا را کمی جلوتر می برد— در ند چرخه ی رویداد به عنوان یک کتابخانه جدا از زبان نیست، بلکه با زبان گره خرده است. در سیستم های دیگر یک blocking call برای شروع چرخه رویداد وجود دارد. متد رایج این است که callback های مورد نیاز در شروع اسکریپت نوشته می شوند و در پایان سرور از طریق اجرای یک متدِ بلاک کننده یا Blocking Call شروع به کار می کند. مثلاُ در رابی داریم: EventMachine::run(). در ند چنین متدی برای شروع حلقه رویداد وجود ندارد. ند به سادگی پس از پردازش اسکریپت ورودی به چرخه ی رویداد وارد می شود. ند با تشخیص اینکه دیگر هیچ callback ای برای اجرا وجود ندارد از این حلقه خارج می شود. این عملکرد مانند اجرای جاوا اسکریپت در مرورگرهاست. حلقه رویداد از دید کاربر مخفی است.

در ند HTTP یک پروتکل ممتاز است. این کتابخانه بر اساس تجربیات نویسنده آن در توسعه برنامه های تحت شبکه و وب سرورها ایجاد شدهاست. برای مثال data streaming در اکثر framework ها کاری غیر ممکن است. ند سعی کرده است که این مشکلات را در پارسر HTTP خود و API های مربوط به آن حل کند. این ویژگی به همراه ساختار رویدادگرای ند، می تواند مبنایی برای بهترین کتابخانه ها و Framework های تحت وب باشد.

اما همزمانی در سیستم های چند پردازنده ای چطور؟ آیا thread ها برای گسترش برنامه روی کامپیوتر های چند هسته ای ضروری نیستند؟ در ند می توانید از دستور child_process.fork() برای شروع پروسس های جدید استفاده کنید. این پروسس های جدید به صورت موازی اجرا خواهند شد. همچنین می توانید از ماژول cluster به منظور load balancing کانکشن ها روی چند پروسس استفاده کنید.

همچنین ببینید: