ماژول sync-node - راه حلی برای همزمان سازی

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 1 دقیقه
دسته بندی ها : نود جی اس

روزهایی که با پیشرفت جاوا اسکریپت همراه بود همچنان بحث روی اینکه آیا برنامه نویسی غیرهمزمان (async) خوب هست یا نه, شدت می گرفت. در نهایت با رشد زیاد جاوا اسکریپت و ماژول هایش و موفقیت فریمورک هاش همراه شد. این مثل یک حقیقت تخمینی است که متد برنامه نویسی غیرهمزمان چیز بدی نیست. بهرحال در خیلی زمینه ها ما نیاز به وظایف همزمان رو در جاوا اسکریپت می بینیم و سعی می کنیم اونها را با استفاده از promise ها حل کنیم. امروز من میخواهم به شما نشون بدم که چطور بسادگی عملیات همزمان سازی رو انجام بدیم. اما قبلش درمورد یک مشکل صحبت می کنیم.

ماژول sync-node - راه حلی برای همزمان سازی

مشکل

اگر وظیفه یک غیرهمزمان باشه و وظیفه دو همزمان باشه (یا حتی غیرهمزمان) حالا چطور وظیفه دو رو بعد از اینکه وظیفه یک کامل شد اجرا کنیم.

راه حل

-Promise : استفاده از promise راه خوبی برای مدیریت وظایف غیرهمزمان هست. اما اگر شما 50 وظیفه برای اجرای پشت سر هم دارید چی؟ ممکنه شبیه کار همون یک وظیفه باشه ولی اجرای اون 50 بار با پارامترهای متفاوت. مثلا شما دارید وبسایت یک هتل رو برای 90 روز آینده می سازید. اجرای 90 درخواست درخواست بصورت موازی میتونه به شوبسایت هتل کمک کنه تا شما رو شناسایی و بلاک کنه. پس شما نیاز دارید که یک درخواست وقتی اجرا شه که قبلی کامل شده باشه.

-موضوع همزمانی : پلاگین هایی وجود دارند که همه چیز رو همزمان می کنند. اما مشکل اینه که جاوا اسکریپت تک موضوعی هست. پس اگر شما یک موضوع رو بلاک کنید و منتظر بمونید برای یک درخواست, کل اپلیکیشن هنگ میکنه.

sync-node

ماژول sync-node یک راه راحت و موثر برای همزمان سازی هرچیزی بدون بلاک کردن موضوع اصلی هست. این پلاگین از همان مکانیزمی که در اینجا مطرح شده استفاده میکنه.

sync-node چیست؟

sync-node یک پلاگین npm هست که شما میتونید یک صف ویژه برای اجرای جاوا اسکریپت بسازید. شما میتونید توابع رو یکی پس از دیگری push داخل صف بدید و اونها طبق همین ترتیبی که push دادید اجرا شوند. اگر شما تابع یک رو اول push بدید و سپس اقدام به push تابع دو کنید, سپس مقدار برگردانده شده از تابع یک اولین مقدار argument از تابع دو میشه.

برای نصب این پلاگین از دستور زیر استفاده کنید :

npm install sync-node

یک مثال از استفاده ی sync-node


var SN = require('sync-node');
var pn = SN.createQueue();

pn.pushJob(function(){
    var valueToBeReturned = "fox";
    return new Promise(function (resolve, reject) {
        setTimeout(function() {
            console.log("I am supposed to be first!! I will return "+ valueToBeReturned);
            resolve(valueToBeReturned);
        }, 5000);

    })
});

pn.pushJob(function(res){
    var secondValueTpReturn = "VoidCanvas";
    console.log("I should come second!! Previous job's response was "+res);
    return secondValueTpReturn;
});

pn.pushJob(function(res){
    return new Promise(function (resolve, reject) {
        setTimeout(function() {
            console.log("Yes, I am third!! Prev response was "+res);
            resolve();
        }, 1000);

    })
});


pn.pushJob(function(res){
    console.log("Oh no.. I'm last!!");
});

با استفاده از تابع ()createQueue ما یک صف خالی میسازیم. هرچیزی که در این صف psuh داده بشه یکی یکی اجرا میشه. برای push یک وظیفه داخل صف شما باید از تابع ()pushJob استفاده کنید. اگر تابعی که push میدید غیرهمزمان باشه اون باید یک آبجکت promise برگردونه, وگرنه sync-node نمیتونه اون رو شناسایی کنه و منتظر میمونه تا وقتش تموم شه.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید