ইভেন্ট লুপ বোঝা


135

আমি এটি সম্পর্কে চিন্তাভাবনা করছি এবং এটিই আমি নিয়ে এসেছি:

ধরা যাক আমাদের মতো একটি কোড রয়েছে:

console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);

একটি অনুরোধ আসে, এবং জেএস ইঞ্জিন ধাপে ধাপে উপরের কোডটি কার্যকর করতে শুরু করে। প্রথম দুটি কল হ'ল সিঙ্ক কল। কিন্তু যখন এটি setTimeoutপদ্ধতিতে আসে , এটি একটি অ্যাসিঙ্ক এক্সিকিউশন হয়ে যায়। তবে জেএস তাৎক্ষণিকভাবে এ থেকে ফিরে আসে এবং সম্পাদন চালিয়ে যায়, যাকে বলা হয় Non-Blockingবা Async। এবং এটি অন্যান্য ইত্যাদির উপর কাজ করে চলেছে

এই মৃত্যুদণ্ডের ফলাফল নিম্নলিখিত:

acdb

সুতরাং মূলত দ্বিতীয়টি setTimeoutপ্রথম সমাপ্ত হয়েছিল এবং এর কলব্যাক ফাংশন প্রথমটির চেয়ে আগে কার্যকর হয়ে যায় এবং তা বোঝা যায়।

আমরা এখানে একক থ্রেডযুক্ত অ্যাপ্লিকেশন সম্পর্কে কথা বলছি। জেএস ইঞ্জিন এটি কার্যকর করে রাখে এবং যতক্ষণ না এটি প্রথম অনুরোধটি শেষ করে, এটি দ্বিতীয়টিতে যাবে না। তবে ভাল কথাটি হ'ল এটি setTimeoutসমাধান করার মতো ব্লকিং অপারেশনের জন্য অপেক্ষা করবে না তাই এটি আরও দ্রুত হবে কারণ এটি নতুন আগত অনুরোধগুলি গ্রহণ করে।

তবে আমার প্রশ্নগুলি নিম্নলিখিত আইটেমগুলির চারপাশে উত্থিত হয়:

# 1: আমরা যদি একক থ্রেডযুক্ত অ্যাপ্লিকেশনটির বিষয়ে কথা বলি, তবে setTimeoutsজেএস ইঞ্জিন আরও অনুরোধ গ্রহণ করে এবং সেগুলি কার্যকর করার সময় কোন প্রক্রিয়াটি প্রক্রিয়া করে? কীভাবে একক থ্রেড অন্যান্য অনুরোধে কাজ চালিয়ে যেতে পারে? setTimeoutঅন্যান্য অনুরোধগুলি আসতে এবং কার্যকর করা অবস্থায় কী কাজ করে ?

# 2: যদি setTimeoutআরও অনুরোধগুলি আসে এবং কার্যকর করা হয় তখন এই ফাংশনগুলি যদি পর্দার আড়ালে কার্যকর করা হয়, তবে পর্দার পিছনে অ্যাসিঙ্ক মৃত্যুদণ্ড কার্যকর করা কী? আমরা যাকে বলে সেই জিনিসটি কী EventLoop?

# 3: তবে পুরো পদ্ধতিটি EventLoopএমনভাবে রাখা উচিত নয় যাতে পুরো জিনিসটি কার্যকর হয় এবং কলব্যাক পদ্ধতিটি কল হয়? কলব্যাক ফাংশন সম্পর্কে কথা বলার সময় এটিই আমি বুঝতে পারি:

function downloadFile(filePath, callback)
{
  blah.downloadFile(filePath);
  callback();
}

তবে এই ক্ষেত্রে, জেএস ইঞ্জিন কীভাবে জানতে পারে যে এটি একটি অ্যাসিঙ্ক ফাংশন কিনা তা যাতে এটি EventLoop? Perhaps something like theসি # তে অ্যাসিঙ্ক কীওয়ার্ডে কলব্যাক রাখতে পারে বা কোনও বৈশিষ্ট্যের কোনও ধরণের যা জেএস ইঞ্জিনটি পদ্ধতি গ্রহণ করবে তা হ'ল একটি অ্যাসিঙ্ক পদ্ধতি is এবং সেই অনুযায়ী চিকিত্সা করা উচিত।

# 4: তবে একটি নিবন্ধটি কীভাবে জিনিসগুলি কাজ করছে তা নিয়ে আমি অনুমান করেছিলাম তার সম্পূর্ণ বিপরীতে বলেছেন:

ইভেন্ট লুপটি কলব্যাক ফাংশনের একটি সারি। যখন একটি অ্যাসিঙ্ক ফাংশন সঞ্চালিত হয়, কলব্যাক ফাংশনটি কাতারে ধাক্কা দেয়। জাভাস্ক্রিপ্ট ইঞ্জিন একটি অ্যাসিঙ্ক ফাংশন কার্যকর হওয়ার পরে কোডটি না হওয়া পর্যন্ত ইভেন্টের লুপটির প্রক্রিয়া শুরু করে না।

# 5: এবং এই চিত্রটি এখানে রয়েছে যা সহায়ক হতে পারে তবে চিত্রটির প্রথম ব্যাখ্যাটি 4 নম্বরের প্রশ্নে উল্লিখিত একই জিনিসটি বলছে:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আমার প্রশ্নটি এখানে উপরে তালিকাভুক্ত আইটেমগুলি সম্পর্কে কিছু স্পষ্টতা পেতে?


1
থ্রেডগুলি এই সমস্যাগুলি পরিচালনা করার জন্য সঠিক রূপক নয়। ঘটনা চিন্তা করুন।
অস্বীকার করেন সাগুরেট

1
@ অডিস্ট্রয়: জেএসের ইভেন্ট রূপকটি চিত্রিত করার জন্য একটি কোড নমুনা দেখতে ভাল লাগবে।
তারিক

আপনার প্রশ্নটি এখানে ঠিক কী তা আমি দেখতে পাচ্ছি না।
অস্বীকার করেন সাগুরেট

1
@ অডিস্ট্রয়: আমার প্রশ্নটি এখানে উপরে তালিকাভুক্ত আইটেমগুলি সম্পর্কে কিছু স্পষ্টতা পাব?
তারিক

2
নোড একক থ্রেডযুক্ত নয় তবে এটি আপনার পক্ষে গুরুত্বপূর্ণ নয় (এটির পরিবর্তে এটি আপনার ব্যবহারকারীর কোড কার্যকর করার সময় অন্যান্য কাজগুলি পরিচালিত করে)। আপনার ব্যবহারকারী কোডে সর্বাধিক শুধুমাত্র একটি কলব্যাক এক সময় কার্যকর করা হয়।
অস্বীকার করেছেন সাগুরেট

উত্তর:


85

1: যদি আমরা একটি একক থ্রেডযুক্ত অ্যাপ্লিকেশন সম্পর্কে কথা বলি, তবে জেএস ইঞ্জিন আরও অনুরোধগুলি গ্রহণ করে এবং সেগুলি সম্পাদন করার সময় সেটটাইমআউটগুলি কী প্রক্রিয়া করে? সেই একক থ্রেডটি কি অন্য অনুরোধগুলিতে কাজ চালিয়ে যাবে? তারপরে কে কে সেটটাইমআউটে কাজ চালিয়ে যাচ্ছে যখন অন্য অনুরোধগুলি আসতে থাকে এবং কার্যকর করা হয়।

নোড প্রক্রিয়াতে কেবল 1 টি থ্রেড রয়েছে যা আসলে আপনার প্রোগ্রামের জাভাস্ক্রিপ্ট কার্যকর করবে। যাইহোক, নোডের মধ্যেই, ইভেন্ট লুপ প্রক্রিয়াটির পরিচালনা করার জন্য বেশ কয়েকটি থ্রেড রয়েছে এবং এর মধ্যে আইও থ্রেডের একটি পুল এবং মুষ্টিমেয় অন্যদের অন্তর্ভুক্ত রয়েছে। মূলটি হ'ল এই থ্রেডগুলির সংখ্যাটি সামঞ্জস্যপূর্ণ সংযোগগুলির সংখ্যার সাথে সামঞ্জস্য করে না যেমন তারা থ্রেড-প্রতি-সংযোগ সম্মতিযুক্ত মডেলটিতে থাকে।

এখন "নির্ধারিত সেটটাইমআউটস" সম্পর্কে, আপনি যখন অনুরোধ করবেন তখন setTimeoutসমস্ত নোড মূলত ভবিষ্যতে কোনও সময় সম্পাদন করার জন্য ফাংশনগুলির একটি ডেটা স্ট্রাকচার আপডেট করে। এটিতে মূলত স্টাফগুলির একটি গুচ্ছ রয়েছে যা করা দরকার এবং ইভেন্ট লুপের প্রতিটি "টিক" এটি নির্বাচন করে, এটি সারি থেকে সরিয়ে দেয় এবং চালায়।

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

2: আরও অনুরোধগুলি আসার সময় এবং চালিত হওয়ার সময় যদি এই সেটটাইমআউটটি পর্দার আড়ালে কার্যকর করা হয়, তবে পর্দার পিছনে অ্যাসিঙ্কের মৃত্যুদণ্ড কার্যকর করা জিনিসটিই আমরা ইভেন্ট লুপের কথা বলছি?

পর্দার আড়ালে কোনও জাভাস্ক্রিপ্ট কার্যকর করা হয় না। আপনার প্রোগ্রামের সমস্ত জাভাস্ক্রিপ্ট একবার এবং একবারে সামনে এবং কেন্দ্র চালায়। পর্দার আড়ালে যা ঘটে তা হ'ল ওএস হ'ল আইও পরিচালনা করে এবং নোড তার প্রস্তুত হওয়ার জন্য অপেক্ষা করে এবং নোড জাভাস্ক্রিপ্টের সারিটি সম্পাদনের জন্য অপেক্ষা করে।

3: জেএস ইঞ্জিন কীভাবে জানতে পারে যে এটি কোনও অ্যাসিঙ্ক ফাংশন এটি যাতে ইভেন্টলুপে রাখতে পারে?

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

4 ইভেন্ট লুপটি কলব্যাক ফাংশনের একটি সারি। যখন একটি অ্যাসিঙ্ক ফাংশন সঞ্চালিত হয়, কলব্যাক ফাংশনটি কাতারে ধাক্কা দেয়। জাভাস্ক্রিপ্ট ইঞ্জিন একটি অ্যাসিঙ্ক ফাংশন কার্যকর হওয়ার পরে কোডটি না হওয়া পর্যন্ত ইভেন্টের লুপটির প্রক্রিয়া শুরু করে না।

হ্যাঁ, এটি সত্য, তবে এটি বিভ্রান্তিকর। মূল জিনিসটি হ'ল সাধারণ প্যাটার্নটি হ'ল:

//Let's say this code is running in tick 1
fs.readFile("/home/barney/colors.txt", function (error, data) {
  //The code inside this callback function will absolutely NOT run in tick 1
  //It will run in some tick >= 2
});
//This code will absolutely also run in tick 1
//HOWEVER, typically there's not much else to do here,
//so at some point soon after queueing up some async IO, this tick
//will have nothing useful to do so it will just end because the IO result
//is necessary before anything useful can be done

সুতরাং হ্যাঁ, আপনি কেবল একই ফিক্সের মধ্যে মেমরির মধ্যে সমস্ত ফিবোনাচি সংখ্যাগুলি একযোগে গণনা করে ইভেন্ট লুপটিকে পুরোপুরি অবরুদ্ধ করতে পারেন, এবং হ্যাঁ এটি আপনার প্রোগ্রামটিকে পুরোপুরি হিমিয়ে ফেলবে। এটি সমবায় সম্মতি। জাভাস্ক্রিপ্টের প্রতিটি টিকের অবশ্যই কিছু যুক্তিসঙ্গত পরিমাণের মধ্যে ইভেন্টের লুপটি উত্পন্ন করতে হবে বা সামগ্রিক আর্কিটেকচার ব্যর্থ হয়।


1
আসুন বলুন যে আমার একটি সারি রয়েছে যা সার্ভারটি কার্যকর করতে 1 মিনিট সময় নেবে এবং প্রথম জিনিসটি ছিল কিছু সেকেন্ড ফাংশন যা 10 সেকেন্ড পরে শেষ হয়েছিল। এটি কিউয়ের শেষ প্রান্তে চলে যাবে বা এটি প্রস্তুত হওয়া তাত্ক্ষণিকভাবে নিজেকে লাইনে ফেলে দেবে?
ilo

4
সাধারণত এটি সারির শেষ প্রান্তে চলে যাবে, তবে process.nextTickবনাম setTimeoutবনামের শব্দার্থক setImmediateশব্দগুলি সম্পূর্ণ আলাদা, যদিও আপনাকে সত্যই যত্ন নেওয়া উচিত নয়। আমার কাছে সেটটাইমআউট এবং বন্ধুদের নামে একটি ব্লগ পোস্ট রয়েছে যা আরও বিস্তারিতভাবে যায়।
পিটার লিয়ন্স

আপনি দয়া করে বিস্তারিত বলতে পারেন? আমাদের বলুন যে আমার কাছে দুটি কলব্যাক রয়েছে এবং প্রথমটির 10 মিনিটের এক্সিকিউশন সময় সহ একটি পরিবর্তনকালীন পদ্ধতি রয়েছে এবং 1 মিনিটের সেটটাইমআউট এবং দ্বিতীয়টিতে 10 সেকেন্ডের সেটটাইমআউট সহ 50ms এক্সিকিউশন সময় সহ একটি পরিবর্তনব্যাকগ্রাউন্ড পদ্ধতি রয়েছে। আমি মনে করি চেঞ্জব্যাকগ্রাউন্ডটি প্রথমে কাতারে থাকবে এবং পরিবর্তন রঙটি পরবর্তী হবে। এর পরে ইভেন্ট লুপটি পদ্ধতিগুলি সিঙ্ক্রোনসিভ করে তুলেছে। আমি কি সঠিক?
শেশেপাই

1
@ শেশেপাই ইংলিশের অনুচ্ছেদে লিখিত থাকাকালীন কোড নিয়ে আলোচনা করা সবার পক্ষে খুব বিভ্রান্তিকর। একটি কোড স্নিপেট সহ কেবল একটি নতুন প্রশ্ন পোস্ট করুন যাতে লোকে কোড বর্ণনার পরিবর্তে কোডের ভিত্তিতে উত্তর দিতে পারে, যা প্রচুর অস্পষ্টতা ফেলে।
পিটার লিয়নস

youtube.com/watch?v=QyUFheng6J0&spfreload=5 এটি জাভাস্ক্রিপ্ট ইঞ্জিনের আরেকটি ভাল ব্যাখ্যা
মুকেশ কুমার

65

ফিলিপ রবার্টসের একটি দুর্দান্ত ভিডিও টিউটোরিয়াল রয়েছে যা জাভাস্ক্রিপ্ট ইভেন্টের লুপটিকে সর্বাধিক সরল ও ধারণাগত উপায়ে ব্যাখ্যা করে। প্রতিটি জাভাস্ক্রিপ্ট বিকাশকারীকে দেখতে হবে।

ইউটিউবে ভিডিও লিঙ্কটি এখানে ।


16
আমি এটি দেখেছি এবং এটি প্রকৃতপক্ষে সেরা ব্যাখ্যা ছিল।
তারিক

1
জাভাস্ক্রিপ্ট ভক্ত এবং উত্সাহীদের জন্য অবশ্যই একটি ভিডিও দেখতে হবে watch
নীড়াস

1
এই ভিডিওটি আমার লাইভ পরিবর্তন করে
Hu

1
এখানে ঘুরে বেড়াতে এসেছি .. এবং এটি আমার কাছে পাওয়া সেরা ব্যাখ্যাগুলির মধ্যে একটি .. ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ ...: ডি
রোহিতস

1
এটি একজন
চক্ষুশিল্পী

11

হোস্ট প্রক্রিয়াটি একক থ্রেডড বলে মনে করবেন না, তারা নয়। একক থ্রেড যা হ'ল হোস্ট প্রক্রিয়ার অংশ যা আপনার জাভাস্ক্রিপ্ট কোড চালায়।

ব্যাকগ্রাউন্ড কর্মী ব্যতীত , তবে এগুলি পরিস্থিতি জটিল করে তোলে ...

সুতরাং, আপনার সমস্ত জেএস কোড একই থ্রেডে চালিত হয় এবং আপনার জেএস কোডের দুটি পৃথক অংশ একসাথে চালানোর কোনও সম্ভাবনা নেই (সুতরাং, আপনি পরিচালনা করার জন্য সম্মতিসূচক নিগমায়ার পাবেন না)।

যে জেএস কোডটি কার্যকর করছে তা হ'ল হোস্ট প্রক্রিয়া ইভেন্ট লুপ থেকে নেওয়া সর্বশেষ কোড। আপনার কোডে আপনি মূলত দুটি জিনিস করতে পারেন: কিছু ঘটনা ঘটে গেলে ভবিষ্যতে কার্যকর করতে সিঙ্ক্রোনাস নির্দেশাবলী এবং সময়সূচী ফাংশনগুলি চালান।

আপনার উদাহরণ কোডটির এখানে আমার মানসিক প্রতিনিধিত্ব (সাবধান: এটি কেবলমাত্র, আমি ব্রাউজার বাস্তবায়নের বিশদটি জানি না!):

console.clear();                                   //exec sync
console.log("a");                                  //exec sync
setTimeout(                //schedule inAWhile to be executed at now +1 s 
    function inAWhile(){
        console.log("b");
    },1000);    
console.log("c");                                  //exec sync
setTimeout(
    function justNow(){          //schedule justNow to be executed just now
        console.log("d");
},0);       

আপনার কোডটি চলমান অবস্থায়, হোস্ট প্রক্রিয়াতে থাকা অন্য থ্রেডটি ঘটছে এমন সমস্ত সিস্টেমের ইভেন্টের উপর নজর রাখে (ইউআইতে ক্লিক করে, ফাইলগুলি পঠিত হয়, নেটওয়ার্ক প্যাকেট প্রাপ্ত হয় ইত্যাদি) etc.

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

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

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