সার্ভার সাইড জাভাস্ক্রিপ্ট ইঞ্জিনগুলির প্রসঙ্গে, I / O বা অ্যাসিঙ্ক্রোনাস I / O অ-ব্লকিং কী? আমি জাভা সার্ভারের পাশ বাস্তবায়নের ক্ষেত্রে এটি একটি সুবিধা হিসাবে উল্লেখ করা দেখছি।
সার্ভার সাইড জাভাস্ক্রিপ্ট ইঞ্জিনগুলির প্রসঙ্গে, I / O বা অ্যাসিঙ্ক্রোনাস I / O অ-ব্লকিং কী? আমি জাভা সার্ভারের পাশ বাস্তবায়নের ক্ষেত্রে এটি একটি সুবিধা হিসাবে উল্লেখ করা দেখছি।
উত্তর:
সিঙ্ক্রোনাস এক্সিকিউশন সাধারণত ক্রমানুসারে কোড এক্সিকিউটিভকে বোঝায়। অ্যাসিঙ্ক্রোনাস এক্সিকিউশন বলতে মৃত্যুদন্ড কার্যকর করে যা কোডে প্রদর্শিত ক্রম অনুসারে চালিত হয় না। নিম্নলিখিত উদাহরণে, সিঙ্ক্রোনাস অপারেশন অ্যালার্টগুলিকে ক্রমানুসারে গুলি চালায়। অ্যাসিঙ্ক অপারেশনে, alert(2)
দ্বিতীয়টি কার্যকর করার সময় উপস্থিত হয়, এটি হয় না।
সিঙ্ক্রোনাস: 1,2,3
alert(1);
alert(2);
alert(3);
অ্যাসিঙ্ক্রোনাস: 1,3,2
alert(1);
setTimeout(() => alert(2), 0);
alert(3);
ব্লকিং সেই ক্রিয়াকলাপগুলিকে বোঝায় যেগুলি অপারেশন শেষ না হওয়া পর্যন্ত আরও কার্যকরকরণকে অবরুদ্ধ করে। অ-ব্লকিং এমন কোডকে বোঝায় যা কার্যকর করে না। প্রদত্ত উদাহরণে localStorage
এটি একটি ব্লকিং অপারেশন হিসাবে এটি পড়ার জন্য নির্বাহের স্টল রাখে। অন্যদিকে, fetch
এটি একটি অবরুদ্ধকরণ অপারেশন, কারণ এটি alert(3)
কার্যকর করা থেকে স্টল না করে ।
// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);
// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);
অ-ব্লকিং, অ্যাসিনক্রোনাস অপারেশনের একটি সুবিধা হ'ল আপনি মেমরির পাশাপাশি একক সিপিইউ ব্যবহার করতে পারেন ize
সিঙ্ক্রোনাস, ব্লকিং অপারেশনের একটি উদাহরণ হল কীভাবে কিছু ওয়েব সার্ভার জাভা বা পিএইচপি-র মতো আইও বা নেটওয়ার্ক অনুরোধগুলি হ্যান্ডেল করে। যদি আপনার কোড কোনও ফাইল বা ডাটাবেস থেকে পড়ে, আপনার কোডটি কার্যকর করার পরে এটি সমস্ত কিছু "ব্লক" করে। সেই সময়কালে, আপনার মেশিন কোনও থ্রেডের জন্য মেমরি এবং প্রক্রিয়াকরণের সময় ধরে রাখে যা কিছুই করছে না ।
থ্রেড স্থবির হয়ে গিয়েছে এমন অন্যান্য অনুরোধগুলি পূরণ করার জন্য আপনার সফ্টওয়্যারটির উপর নির্ভর করে। বেশিরভাগ সার্ভার সফ্টওয়্যার যা করে তা অতিরিক্ত অনুরোধগুলি পূরণ করার জন্য আরও থ্রেড করে। এর জন্য আরও মেমরি গ্রাস করা এবং আরও প্রক্রিয়াজাতকরণ প্রয়োজন।
নোডে তৈরি অ্যাসিঙ্ক্রোনাস, অ-ব্লকিং সার্ভারগুলি - সমস্ত অনুরোধগুলি পরিবেশন করতে শুধুমাত্র একটি থ্রেড ব্যবহার করে। এর অর্থ নোডের একটি উদাহরণ একক থ্রেড থেকে সর্বাধিক উপার্জন করে। আই / ও এবং নেটওয়ার্ক ক্রিয়াকলাপ হ'ল বাধা prem
অনুরোধগুলি যখন সার্ভারে আসে, সেগুলি একবারে একটি করে পরিবেশন করা হয়। যাইহোক, যখন সার্ভিস কোডটি ডিবিটিকে উদাহরণস্বরূপ জিজ্ঞাসা করা দরকার, এটি কলব্যাকটিকে দ্বিতীয় সারিতে পাঠায় এবং মূল থ্রেড চলতে থাকবে (এটি অপেক্ষা করে না)। এখন যখন ডিবি অপারেশন সম্পূর্ণ হয় এবং ফিরে আসে, সংশ্লিষ্ট কলব্যাকটি দ্বিতীয় সারি থেকে বের হয়ে তৃতীয় সারিতে সারি করা হয় যেখানে তারা মৃত্যুদন্ড কার্যকর হয়। ইঞ্জিন যখন অন্য কিছু চালানোর সুযোগ পায় (যেমন এক্সিকিউশন স্ট্যাকটি খালি করা হয়) তখন এটি তৃতীয় সারিতে কলব্যাক তুলে তা কার্যকর করে।
var startTime = new Date().getTime();
var getEndTime = () => {
var tempEndTime = new Date().getTime();
var second = (tempEndTime - startTime)/1000
return `took ${second} sec...to finish\n`
}
console.log('1: start App', getEndTime())
setTimeout(()=>{
console.log('2: setTimeout', getEndTime())
}, 1000)
console.log('3: End App', getEndTime())
// console -> Process Order: 1 -> 3 -> 2