Node.js Design Patterns Third Edition (published by Packt), A book by Mario Casciaro and Luciano Mammino
Synchronously == Blocking == همزمان
Asynchronously == Non-Blocking == ناهمزمان
کارهای مثل تعامل با دیسک سخت و شبکه عملیات I/O می گویند
زمانی که اجرای کدهای جاوااسکریپت به عملیات I/O می رسد باید منتظر بماند تا عملیات تمام شود. دلیل این امر:چون حلقه رویداد قادر به اجرای جاوااسکریپت در حین وقوع عملیات Blocking رو ندارد
در NodeJS، جاوااسکریپت عملکرد ضعیفی نشان می دهد وقتی منتظر کدهای غیر جاوااسکریپتی هستیم چون عملیات I/O سی پی یو زیادی مصرف میکنند
در کتابخانه استاندارد نوجی اس متدهای همزمان یا Synchronously به نام libuv وجود دارد که متداول ترین عملیات Blocking نودجی اس هستند
ماژول های بومی نیز ممکن است متدهای Blocking داشته باشند
همه متدهای I/O در کتابخانه استاندارد نودجی اس نسخه ناهمزمان )Asynchronously) نیز دارند که Non-Blocking هستند و توابع Callback را می پذیرند. برخی متدها دارای معادل Blocking نیز هستند که نام تابع به Sync ختم می شود
در کد پایین در خط دوم عملیات بلاک می شود تا خواندن فایل کامل شود اگر این خط به خطا بخورد کل برنامه کرش می کند مگر اینکه خطا را هندل کرده باشین
const fs = require('fs')
const data = fs.readFileSync('/file.md')
در کد پایین کدهای بعد readFile اجرا می شوند و پس از اتمام عملیات I/O کدهای کال بک اجرا خواهد شد
const fs = require('fs')
fs.readFile('/file.md', (err, data)=> {
if(err) throw err;
});
در کد دوم که نسخه ناهمزمان کد اول می باشد گرفتن خطا اختیاری است چون خطا دادن در کد ناهمزمان بروی عملکرد دیگر کدها تاثیری ندارد ولی در کد اول چون در موقع خواندن فایل کل عملیات JS قفل می شود در صورت خطا کرش کل برنامه رو داریم
در برنامه نویسی سنتی blocking I/O اجرای نخ تا اتمام عملیات ورودی و خروجی مسدود می شود
// blocks the thread until the data is available
data = socket.read()
// data is available
print(data)
راه حل در برنامه نویسی سنتی استفاده از چندین نخ یا پراسس است که مسدود شدن یک نخ بروی انجام دیگر نخ ها تاثیر منفی نخواهد داشت
زبان نودجی اس از روش non-blocking I/O استفاده می کند )ناهمزمان)
resources = [socketA, socketB, fileA]
while (!resources.isEmpty()) {
for (resource of resources) {
// try to read
data = resource.read()
if (data === NO_DATA_AVAILABLE) {
// there is no data to read at the moment
continue
}
if (data === RESOURCE_CLOSED) {
// the resource was closed, remove it from the list
resources.remove(i)
} else {
//some data was received, process it
consumeData(data)
}
}
}
در کد بالا سی پی یو زیادی مصرف می شود چون مجبور است بارها بررسی کند تا زمانی که یک منبع اماده شود کد بالا برای مدیریت غیرمسدود شده مناسب نیست یکی از روش های خوب برای غیرمسدود کننده استفاده از رویدادهای همزمان (synchronous event) که رابط اطلاع رسانی رویداد نیز نامیده می شود می باشد
ماژول یک برنامه کوچک قابل توسعه و تست می باشد. در نودجی است دو سیستم ماژول وجود دارد: یک: CommonJS دو: ECMAScript میتوانیم با هر کدام که بخواهیم ماژول بنویسیم.


