নোড.জেএস-এ অ-ব্লকিং বা অ্যাসিঙ্ক্রোনাস I / O কী?


136

সার্ভার সাইড জাভাস্ক্রিপ্ট ইঞ্জিনগুলির প্রসঙ্গে, I / O বা অ্যাসিঙ্ক্রোনাস I / O অ-ব্লকিং কী? আমি জাভা সার্ভারের পাশ বাস্তবায়নের ক্ষেত্রে এটি একটি সুবিধা হিসাবে উল্লেখ করা দেখছি।


3
এই ধারণাটি বোঝার জন্য ব্রাউজার পরিবেশে স্ক্রিপ্ট ট্যাগগুলি সম্পর্কে ভাবতে সহায়তা করে। জাকাসের এ সম্পর্কে একটি দুর্দান্ত নিবন্ধ রয়েছে - প্রথম কয়েকটি বিভাগকে ব্লক করার ধারণাটি বোঝানোর
কি-

উত্তর:


317

সিঙ্ক্রোনাস বনাম অ্যাসিনক্রোনাস

সিঙ্ক্রোনাস এক্সিকিউশন সাধারণত ক্রমানুসারে কোড এক্সিকিউটিভকে বোঝায়। অ্যাসিঙ্ক্রোনাস এক্সিকিউশন বলতে মৃত্যুদন্ড কার্যকর করে যা কোডে প্রদর্শিত ক্রম অনুসারে চালিত হয় না। নিম্নলিখিত উদাহরণে, সিঙ্ক্রোনাস অপারেশন অ্যালার্টগুলিকে ক্রমানুসারে গুলি চালায়। অ্যাসিঙ্ক অপারেশনে, 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

অনুরোধগুলি যখন সার্ভারে আসে, সেগুলি একবারে একটি করে পরিবেশন করা হয়। যাইহোক, যখন সার্ভিস কোডটি ডিবিটিকে উদাহরণস্বরূপ জিজ্ঞাসা করা দরকার, এটি কলব্যাকটিকে দ্বিতীয় সারিতে পাঠায় এবং মূল থ্রেড চলতে থাকবে (এটি অপেক্ষা করে না)। এখন যখন ডিবি অপারেশন সম্পূর্ণ হয় এবং ফিরে আসে, সংশ্লিষ্ট কলব্যাকটি দ্বিতীয় সারি থেকে বের হয়ে তৃতীয় সারিতে সারি করা হয় যেখানে তারা মৃত্যুদন্ড কার্যকর হয়। ইঞ্জিন যখন অন্য কিছু চালানোর সুযোগ পায় (যেমন এক্সিকিউশন স্ট্যাকটি খালি করা হয়) তখন এটি তৃতীয় সারিতে কলব্যাক তুলে তা কার্যকর করে।


5
আমি নিশ্চিত না যে আমি পিএইচপি-তে ব্লকিংয়ের অধীনে আপনার ২ য় অনুচ্ছেদটি বুঝতে পেরেছি । আপনি কি বলছেন, "পিএইচপি সাধারণত আইওতে ব্লক করে দিবে, কারণ ওএস স্বয়ংক্রিয়ভাবে আইও অপারেশনগুলিকে থ্রেড করে না?" বা, আপনি কি বলছেন যে এটি পিএইচপি-তে কোনও সমস্যা নয় কারণ পিএইচপি প্রতিটি অনুরোধের জন্য স্বয়ংক্রিয়ভাবে একটি নতুন থ্রেড তৈরি করে যাতে একটি ব্লক করা অনুরোধ পুরো পিএইচপি পরিবেশকে থামিয়ে দেয় না? (আমি
উত্তরোত্তরটি

6
এটা পরেরটি।
জোসেফ

2
অপেক্ষা করুন, যদি এটির দ্বিতীয়টি বোঝায় তবে ব্লকিংয়ের মাধ্যমে আই / ও পিএইচপি (যেমন রিঅ্যাক্টপিএইচপি বা অন্য কিছু) অবরুদ্ধ না করে কী কী সুবিধা রয়েছে। এখনও বিভ্রান্ত
সুনু পিনাস্তিকা ফাজার

5
পছন্দ করুন অ্যাসিঙ্ক অপারেশনটি আপনার কোডের সমান্তরালে চলে। তবে মূল কোডটি ব্যস্ত না হলে মূল কোডটিতে কার্যকর হওয়ার জন্য যে কলব্যাক অ্যাসিঙ্ক অপারেশনের ফলাফলগুলিতে "ফিরে ফিরে আসে" সাইন করা হয়।
জোসেফ

2
@ চার্লিপার্কার এখানে একটি পোস্ট যা অ্যাসিঙ্ক প্রক্রিয়াটির অভ্যন্তরীণ বিষয়ে আরও বেশি আলোচনা করে।
জোসেফ

7
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

কোড উদাহরণ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.