فرایندهای همزمان
فرایندهای همزمان
اگر “http://some.url.1” ابتدا نتایج خود را دریافت کند، کل لیست به یکباره به res نگاشت می شود. اگر چند هزار یا کمتر رکورد باشد، به طور کلی مشکل بزرگی نیست. اما اگر مثلاً 10 میلیون رکورد باشد، اجرای آن ممکن است کمی طول بکشد (چند ثانیه در یک لپتاپ قدرتمند، بسیار بیشتر در یک دستگاه تلفن همراه، و غیره).
در حالی که چنین “فرآیندی” در حال اجرا است، هیچ چیز دیگری در صفحه نمی تواند اتفاق بیفتد، از جمله عدم پاسخ (..) تماس های دیگر، به روز رسانی UI، حتی رویدادهای کاربر مانند پیمایش، تایپ کردن، کلیک کردن روی دکمه و موارد مشابه. این خیلی دردناک است.
بنابراین، برای ایجاد یک سیستم همزمانتر، سیستمی که دوستانهتر باشد و صف حلقه رویداد را درگیر نکند، میتوانید این نتایج را در دستههای ناهمزمان پردازش کنید، پس از اینکه هر یک به حلقه رویداد «تسلیم» شدند تا اجازه دهید رویدادهای انتظار دیگر اتفاق بیفتند.
در اینجا یک رویکرد بسیار ساده وجود دارد:
var res = [];
// `response(..)` receives array of results from the Ajax call
function response(data) {
// let’s just do 1000 at a time
var chunk = data.splice( 0, 1000 );
// add onto existing `res` array
res = res.concat(
// make a new transformed array with all `chunk` values doubled
chunk.map( function(val){
return val * 2;
} )
);
// anything left to process?
if (data.length > 0) {
// async schedule next batch
setTimeout( function(){
response( data );
}, 0 );
}
} /
/ ajax(..) is some arbitrary Ajax function given by a library
ajax( “http://some.url.1”, response );
ajax( “http://some.url.2”, response );
ما مجموعه دادهها را در تکههای حداکثر اندازه 1000 مورد پردازش میکنیم.
با انجام این کار، ما از یک “فرآیند” کوتاه مدت اطمینان میدهیم، حتی اگر این به معنای “فرآیندهای بعدی” بیشتر باشد، زیرا درهمآمیزی در صف حلقه رویداد به ما سایت/اپلیکیشن (عملکردی) بسیار پاسخگوتر میدهد.
البته، ما ترتیب هیچ یک از این «فرایندها» را با تعامل هماهنگ نمی کنیم، بنابراین ترتیب نتایج در res قابل پیش بینی نخواهد بود. اگر نیاز به سفارش بود، باید از تکنیکهای تعاملی مانند تکنیکهایی که قبلاً صحبت کردیم، یا تکنیکهایی که در فصلهای بعدی این کتاب به آنها خواهیم پرداخت، استفاده کنید.
ما از setTimeout(..0) (هک) برای زمانبندی ناهمگام استفاده میکنیم، که اساساً فقط به معنای “چسب کردن این تابع در انتهای صف حلقه رویداد فعلی” است.
توجه: setTimeout(..0) از نظر فنی یک مورد را مستقیماً در صف حلقه رویداد درج نمی کند. تایمر در فرصت بعدی رویداد را درج می کند. به عنوان مثال، دو تماس بعدی setTimeout (..0) به طور دقیق تضمین نمیشوند که به ترتیب تماس پردازش شوند، بنابراین میتوان شرایط مختلفی مانند جابجایی تایمر را مشاهده کرد که در آن ترتیب چنین رویدادهایی قابل پیشبینی نیست. در Node.js، یک رویکرد مشابه process.nextTick(..) است. علیرغم اینکه چقدر راحت (و معمولاً کارآمدتر) خواهد بود، یک راه مستقیم (حداقل هنوز) در همه محیط ها برای اطمینان از سفارش رویداد غیرهمگام وجود ندارد. این موضوع را در بخش بعدی با جزئیات بیشتری بررسی می کنیم.
قوانین ارسال دیدگاه در سایت