একক থ্রেডযুক্ত নন-ব্লকিং আইও মডেলটি নোড.জেজে কীভাবে কাজ করে


325

আমি কোনও নোড প্রোগ্রামার নই, তবে একক থ্রেডযুক্ত নন-ব্লকিং আইও মডেল কীভাবে কাজ করে তা সম্পর্কে আমি আগ্রহী । আমি নোড-জেএস-ইভেন্ট-লুপটি বোঝার পরে নিবন্ধটি পড়ার পরে আমি এ সম্পর্কে সত্যিই বিভ্রান্ত। এটি মডেলের জন্য একটি উদাহরণ দিয়েছে:

c.query(
   'SELECT SLEEP(20);',
   function (err, results, fields) {
     if (err) {
       throw err;
     }
     res.writeHead(200, {'Content-Type': 'text/html'});
     res.end('<html><head><title>Hello</title></head><body><h1>Return from async DB query</h1></body></html>');
     c.end();
    }
);

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

(পিএস, আমি নিশ্চিত নই যে আমি কোডটি ভুল বুঝেছি বা না যেহেতু আমি কখনই নোড ব্যবহার করি নি।) অপেক্ষার সময় নোড কীভাবে A তে B তে যান? এবং আপনি নোডের একক থ্রেডযুক্ত নন-ব্লকিং আইও মডেলটিকে একটি সহজ উপায়ে ব্যাখ্যা করতে পারেন ? আপনি যদি আমাকে সাহায্য করতে পারেন তবে আমি এটির প্রশংসা করব। :)

উত্তর:


374

নোড.জেসটি লিবুভের উপর নির্মিত , একটি ক্রস-প্ল্যাটফর্ম লাইব্রেরি যা সমর্থিত ওএসেস (ইউনিক্স, ওএস এক্স এবং উইন্ডোজ কমপক্ষে) দ্বারা সরবরাহিত এসিনক্রোনাস (অ-ব্লকিং) ইনপুট / আউটপুটটির জন্য এপিস / সিসকোলগুলি বিমূর্ত করে।

অ্যাসিঙ্ক্রোনাস আইও

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

আমি যে মডেলটির বর্ণনা দিয়েছি তাতে সমস্যাটি হ'ল এটি প্রোগ্রামারটির পক্ষে তাত্পর্যপূর্ণ এবং অ-অনুক্রমিক প্রকৃতির কারণ নিয়ে যুক্তিযুক্ত হওয়া কঠিন নয় familiar "আপনাকে এ ফাংশনে অনুরোধ করতে হবে এবং ফলাফলটি অন্য কোনও ফাংশনে পরিচালনা করতে হবে যেখানে আপনার এ থেকে স্থানীয়রা সাধারণত উপলব্ধ থাকে না।"

নোডের মডেল (ধারাবাহিকতা পাসিং স্টাইল এবং ইভেন্ট লুপ)

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

তদ্ব্যতীত, কোনও আইও অপারেশন তৈরি করে ফাংশন শুরু করার পরে কলিং ফাংশনটি সাধারণত returnনোডের ইভেন্ট লুপকে নিয়ন্ত্রণ করে । এই লুপটি পরবর্তী কলব্যাক বা ফাংশন শুরু করবে যা মৃত্যুদন্ড কার্যকর করার জন্য নির্ধারিত ছিল (সম্ভবত সম্ভবত সম্পর্কিত ইভেন্টটি ওএস দ্বারা অবহিত করা হয়েছিল) - এটি একাধিক অনুরোধের একযোগে প্রক্রিয়াজাতকরণের অনুমতি দেয়।

আপনি নোডের ইভেন্টের লুপটি কার্নেলের প্রেরণের সাথে কিছুটা অনুরূপ হিসাবে ভাবতে পারেন : কার্নেলটি একটি আটকে থাকা থ্রেড কার্যকর করার পরে নির্ধারিত হবে যখন তার মুলতুবি আইও শেষ হয়ে গেলে নোড একটি কলব্যাক শিডিউল করবে যখন সম্পর্কিত ঘটনাটি ঘটবে।

উচ্চতর সমবর্তী, কোনও সমান্তরালতা

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


45
একটি ফলোআপ প্রশ্ন: আসলে আই / ও আসলে কীভাবে হয়? নোড সিস্টেমে একটি অনুরোধ করছে এবং এটি শেষ হয়ে গেলে অবহিত হওয়ার জন্য বলছে। তাহলে সিস্টেমটি কি একটি থ্রেড চালাচ্ছে যা I / O করছে, বা সিস্টেমটিও বাধা ব্যবহার করে হার্ডওয়্যার পর্যায়ে I / O অবিচ্ছিন্নভাবে সম্পাদন করছে? কোথাও কোথাও কোনও কিছুর জন্য আই / ও শেষ হওয়ার জন্য অপেক্ষা করতে হবে এবং এটি শেষ না হওয়া অবধি ব্লক হয়ে যাচ্ছে এবং কিছু পরিমাণ সংস্থান গ্রহণ করবে।
ফিলিপ

6
কেবল লক্ষ্য করা গেছে যে এই ফলোআপ মন্তব্যের উত্তর নীচে @ ব্যবহারকারীর দ্বারা দেওয়া হয়েছে, আমি আশা করি এই দুটি উত্তর একত্রীকরণের উপায় ছিল।
lfalin

4
আমি আশা করি আপনি দীর্ঘ সময় দ্বিগুণ প্রতিক্রিয়া লিখতে পারেন, তাই আমি আরও দ্বিগুণ বুঝতে পারছি।
রাফায়েল আইং

নোড রেকর্ডের জন্য অনেক জায়গায় সমর্থিত। আমি যখন এমআইপিএস 32 রাউটারগুলির জন্য ফার্মওয়্যার ডিজাইন করছিলাম তখন নোড.জেএস ওপেনডাব্লুআরটি এর মাধ্যমে চালানো যেতে পারে।
কিউস - মোনিকা

কিভাবে এটি অ্যাপাচে ওভার স্কোর? অ্যাপাচি পৃথক থ্রেড সহ সাম্প্রতিক সংযোগগুলি পরিচালনা করতেও সক্ষম।
সুহেল গুপ্ত

210

ভাল, কিছু দৃষ্টিকোণ দেওয়ার জন্য, আমি অ্যাপাচে সঙ্গে node.js তুলনা করা যাক।

অ্যাপাচি হ'ল মাল্টি-থ্রেডেড এইচটিটিপি সার্ভার, সার্ভারের প্রতিটি অনুরোধের জন্য এটি পৃথক থ্রেড তৈরি করে যা সেই অনুরোধটি পরিচালনা করে।

অন্যদিকে নোড.জেসগুলি ইভেন্ট চালিত, একক থ্রেড থেকে সমস্ত অনুরোধকে অবিচ্ছিন্নভাবে পরিচালনা করে।

যখন অ্যাপাচে A এবং B প্রাপ্ত হয়, দুটি থ্রেড তৈরি করা হয় যা অনুরোধগুলি পরিচালনা করে। প্রতিটি পৃথকভাবে ক্যোয়ারি পরিচালনা করছে, প্রত্যেকে পৃষ্ঠাটি পরিবেশন করার আগে ক্যোয়ারির ফলাফলের জন্য অপেক্ষা করছে। পৃষ্ঠাটি কেবল অনুসন্ধান শেষ না হওয়া পর্যন্ত পরিবেশন করা হবে। ক্যোয়ারী আনতে বাধা দেওয়া হচ্ছে কারণ ফলাফলটি না পাওয়া পর্যন্ত সার্ভারটি বাকি থ্রেডটি কার্যকর করতে পারে না।

নোডে, সি.কিউরিটি অ্যাসিক্রোনাল পদ্ধতিতে পরিচালনা করা হয়, যার অর্থ সি.কোয়ারি যখন এ-এর ফলাফল নিয়ে আসে তখন এটি বি এর জন্য সি.কোয়ারি পরিচালনা করতে লাফ দেয়, এবং ফলাফল যখন এ পৌঁছায় তখন এটি ফলাফলকে কলব্যাকে ফেরত পাঠায় যা প্রেরণ করে প্রতিক্রিয়া। আনয়ন শেষ হলে নোড.জেএস কলব্যাক কার্যকর করতে জানে।

আমার মতে, এটি একক থ্রেড মডেল হওয়ায়, একটি অনুরোধ থেকে অন্য অনুরোধে স্যুইচ করার কোনও উপায় নেই।

আসলে নোড সার্ভার হ'ল সর্বদা আপনার জন্য। স্যুইচগুলি তৈরি করার জন্য, (অ্যাসিনক্রোনাস আচরণ) বেশিরভাগ ফাংশন যা আপনি ব্যবহার করবেন তার কলব্যাক থাকবে।

সম্পাদন করা

এসকিউএল কোয়েরিটি মাইএসকিএল লাইব্রেরি থেকে নেওয়া হয়েছে । এটি এসকিউএল অনুরোধগুলি সারি করার জন্য কলব্যাক শৈলীর পাশাপাশি ইভেন্ট ইমিটার প্রয়োগ করে। এটি তাদের অবিচ্ছিন্নভাবে কার্যকর করে না, এটি অভ্যন্তরীণ লিবুভ থ্রেডগুলি দ্বারা সম্পাদিত হয় যা অবরুদ্ধকরণ অ / ব্লকিং I / O এর বিমূর্ততা সরবরাহ করে। কোয়েরি করার জন্য নিম্নলিখিত পদক্ষেপগুলি ঘটে:

  1. ডিবিতে একটি সংযোগ খুলুন, সংযোগ নিজেই অ্যাসিক্রোনোলস তৈরি করা যেতে পারে।
  2. একবার db সংযুক্ত হয়ে গেলে সার্ভারে ক্যোয়ারী সরবরাহ করা হয়। প্রশ্নগুলি সারিবদ্ধ করা যেতে পারে।
  3. মূল ইভেন্ট লুপটি কলব্যাক বা ইভেন্টের সাথে সমাপ্তির বিষয়ে বিজ্ঞপ্তি পায়।
  4. প্রধান লুপটি আপনার কলব্যাক / ইভেন্ট হ্যান্ডেলারকে কার্যকর করে।

HTTP সার্ভারে আগত অনুরোধগুলি একই ধরণের হ্যান্ডেল করা হয়। অভ্যন্তরীণ থ্রেড আর্কিটেকচার এরকম কিছু:

node.js ইভেন্ট লুপ

সি ++ থ্রেডগুলি হ'ল লিবুভ যা অ্যাসিঙ্ক্রোনাস আই / ও (ডিস্ক বা নেটওয়ার্ক) করে। থ্রেড পুলে অনুরোধ প্রেরণের পরে প্রধান ইভেন্টের লুপটি চালিয়ে যেতে থাকে। এটি অপেক্ষা বা ঘুম না করায় এটি আরও অনুরোধগুলি গ্রহণ করতে পারে। এসকিউএল কোয়েরি / এইচটিটিপি অনুরোধগুলি / ফাইল সিস্টেমগুলি এইভাবে ঘটে।


16
ডায়াগ্রাম খুব দরকারী।
আনমল সারাফ

14
অপেক্ষা করুন, আপনার ডায়াগ্রামে আপনার কাছে "অভ্যন্তরীণ সি ++ থ্রেডপুল" রয়েছে, যার অর্থ হ'ল সমস্ত আইও ব্লকিং অপারেশনগুলি কোনও থ্রেড উত্পন্ন করবে, তাই না? সুতরাং যদি আমার নোড অ্যাপ্লিকেশনটি প্রতিটি অনুরোধের জন্য কিছু আইও কাজ করে তবে নোড মডেল এবং অ্যাপাচি মডেলের মধ্যে কার্যত কোনও পার্থক্য নেই? দুঃখিত আমি এই অংশ পাচ্ছি না।
gav.newalkar

21
@ gav.newalkar তারা কোনও থ্রেড রাখে না, অনুরোধগুলি সারিবদ্ধ হয়। থ্রেডপুলের থ্রেডগুলি তাদের প্রক্রিয়া করে। থ্রেডগুলি গতিশীল নয় এবং অ্যাপাচে যেমন অনুরোধ অনুসারে নয়। এগুলি সাধারণত স্থির হয় এবং সিস্টেম থেকে সিস্টেমে পৃথক হয়।
user568109

10
@ user568109 তবে অ্যাপাচি থ্রেডপুলটিও ব্যবহার করছে ( httpd.apache.org/docs/2.4/mod/worker.html )। সুতরাং শেষ পর্যন্ত নোড.জেএস সহ একটি সেটআপের মধ্যে পার্থক্য কেবল সামনে থ্রেডপুল যেখানে অবস্থিত সেখানে অ্যাপাচি-র সাথে আলাদা হয়, তাই না?
ক্রিস

13
সেই চিত্রটি অফিসিয়াল ডক্সের প্রথম পৃষ্ঠায় থাকা উচিত।
বুভিয়ার

52

নোড.জেএস পর্দার আড়ালে লিবুভ ব্যবহার করে। libuv একটি থ্রেড পুল (ডিফল্ট আকারে 4 আকার)। অতএব নোড.জেএস সম্মতি অর্জনের জন্য থ্রেড ব্যবহার করে

তবে , আপনার কোডটি একক থ্রেডে চলবে (যেমন, নোড.জেএস ফাংশনগুলির সমস্ত কলব্যাকগুলি একই থ্রেড, তথাকথিত লুপ-থ্রেড বা ইভেন্ট-লুপে কল করা হবে)। লোকেরা যখন "নোড.জেএস একটি থ্রেডে চলে" বলে তখন তারা সত্যই "নোড.জেএস এর কলব্যাকগুলি একটি থ্রেডে চালিত হয়" বলছে।


1
সংক্ষিপ্ত তবে স্পষ্ট উত্তর (y)
সুধাংশু গৌড়

1
ভাল উত্তর আমি যুক্ত করব যে I / O এই মূল ইভেন্টের বাইরে ঘটে - লুপ, থ্রেড, অনুরোধ-থ্রেড
আয়নুত পোপা

আমি উত্তরটি 2 ঘন্টার মধ্যে থেকে অনুসন্ধান করেছিলাম, এটি কীভাবে একক থ্রেড অ্যাপ্লিকেশনটিতে সামঞ্জস্য হয়
মুহাম্মদ রমজান

হ্যাঁ, 'পরবর্তী স্তর' উত্তর পাওয়া শক্ত। এটি ব্যাখ্যা করে যে আইওটি আসলে কোথায় হয়ে যায় (অন্য কোনও থ্রেড পুলে)
অলিভার শ

9

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

  • টাইমার অপেক্ষা সম্পূর্ণ
  • পরবর্তী অংশের ডেটা এই ফাইলে লেখা যেতে প্রস্তুত
  • একটি নতুন নতুন এইচটিটিপি অনুরোধ আমাদের পথে আসছে

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

(ঘটনাগুলির উত্স হিসাবে হুডের নীচে কিছুটা যাদু রয়েছে it এর মধ্যে কিছু স্তরের সমান্তরালে চলমান নিম্ন স্তরের কর্মী থ্রেড জড়িত)

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

ইভেন্ট লুপ উচ্চ স্তরের ভিউ

মতে: "10,000 ফুট থেকে ইভেন্ট লুপ - নোড.জেএস এর পিছনে মূল ধারণা"


5

C.query () ফাংশনের দুটি যুক্তি রয়েছে

c.query("Fetch Data", "Post-Processing of Data")

এই ক্ষেত্রে অপারেশন "ফ্যাটা ডেটা" একটি ডিবি-কোয়েরি, এখন এটি নোড.জেএস দ্বারা কোনও শ্রমিকের থ্রেড ছড়িয়ে দিয়ে এবং ডিবি-কোয়েরি সম্পাদনের এই কাজটি প্রদান করে এটি পরিচালনা করতে পারে। (মনে রাখবেন নোড.জেএস অভ্যন্তরীণভাবে থ্রেড তৈরি করতে পারে)। এটি কোনও দেরি না করে তাত্ক্ষণিকভাবে ফাংশনটি সক্ষম করে

দ্বিতীয় আর্গুমেন্ট "ডেটার পোস্ট-প্রসেসিং" একটি কলব্যাক ফাংশন, নোড ফ্রেমওয়ার্কটি এই কলব্যাকটিকে নিবন্ধভুক্ত করে এবং ইভেন্ট লুপ দ্বারা ডাকা হয়।

সুতরাং বিবৃতিটি c.query (paramenter1, parameter2)তাত্ক্ষণিকভাবে ফিরে আসবে, অন্য অনুরোধের জন্য নোডকে সক্ষম করবে।

পিএস: আমি সবেমাত্র নোড বুঝতে শুরু করেছি, আসলে আমি @ ফিলিপকে মন্তব্য হিসাবে এটি লিখতে চেয়েছিলাম তবে যেহেতু যথেষ্ট খ্যাতি পয়েন্ট ছিল না তাই এটি উত্তর হিসাবে লিখেছিল।


3

আপনি যদি আরও কিছুটা পড়েন - "অবশ্যই, ব্যাকএন্ডে, ডিবি অ্যাক্সেস এবং প্রক্রিয়া সম্পাদনের জন্য থ্রেড এবং প্রক্রিয়া রয়েছে However তবে এগুলি আপনার কোডের সাথে স্পষ্টভাবে প্রকাশিত হয় না, তাই আপনি জেনেও এগুলি সম্পর্কে চিন্তা করতে পারেন না can't যে আই / ও ইন্টারঅ্যাকশনগুলি উদাহরণস্বরূপ ডাটাবেস সহ, বা অন্যান্য প্রক্রিয়াগুলির সাথে প্রতিটি অনুরোধের দৃষ্টিকোণ থেকে অবিচ্ছিন্ন হবে যেহেতু সেই থ্রেডগুলি থেকে ফলাফলগুলি আপনার কোডটিতে ইভেন্ট লুপের মাধ্যমে ফিরে আসে ""

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

আপনার উদাহরণে: দুটি অনুরোধ এ (প্রথম আসে) এবং বি রয়েছে আপনি অনুরোধ এ কার্যকর করেন, আপনার কোড সিঙ্ক্রোনিকভাবে চলতে থাকে এবং অনুরোধ কার্যকর করে বি। ইভেন্ট লুপটি অনুরোধ হ'ল হ'ল অনুরোধটির কলব্যাকের সাথে অনুরোধ করে, ফলাফল, একই বি অনুরোধ করতে যায়।


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

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

1

ঠিক আছে, বেশিরভাগ জিনিস এখনও অবধি পরিষ্কার হওয়া উচিত ... জটিল অংশটি এসকিউএল : যদি বাস্তবে এটি অন্য থ্রেড বা প্রক্রিয়াতে চলছে না is এটির সম্পূর্ণ তবে এসকিউএল-এক্সিকিউশনটি পৃথক পদক্ষেপে বিভক্ত হতে হবে (একটি দ্বারা এসকিউএল প্রসেসর অ্যাসিনক্রোনাস এক্সিকিউটিশনের জন্য তৈরি!), যেখানে অ-ব্লককারীগুলি কার্যকর করা হয় এবং ব্লককারীগুলি (যেমন ঘুম) আসলে করতে পারে কার্নেলে স্থানান্তরিত পারে (অ্যালার্ম বিঘ্নিত / ইভেন্ট হিসাবে) এবং ইভেন্টের তালিকায় রাখে প্রধান লুপ

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

সুতরাং, এটি আবার পুনঃব্যবহার করার জন্য: প্রোগ্রামটি কখনই আটকে থাকে না (ঘুমানোর অনুমতি দেওয়া হয় না), ঘুমন্ত কলগুলি কখনই কার্যকর করা হয় না। তাদের কর্তব্য কর্নেল (কিছু লিখুন, নেটওয়ার্কের উপর দিয়ে কিছু আসার অপেক্ষা করুন, সময় কাটিয়ে যাওয়ার জন্য অপেক্ষা করুন) বা অন্য কোনও থ্রেড বা প্রক্রিয়া দ্বারা সম্পন্ন হয়। - নোড প্রক্রিয়াটি প্রতিটি ইভেন্ট-লুপ-চক্রের একবার ওএস-এ কেবলমাত্র অবরুদ্ধ কলগুলিতে কার্নেল দ্বারা কমপক্ষে সেগুলির একটির কাজ শেষ করে কিনা তা পরীক্ষা করে। সেই বিন্দুতে পৌঁছে যায়, যখন অ-ব্লক করা সমস্ত কাজ করা হয়।

পরিষ্কার? :-)

আমি নোডকে চিনি না। কিন্তু সি কোয়েরি কোথা থেকে আসে?


kueue এপল লিনাক্স কার্নেলের স্কেলযোগ্য অ্যাসিক্রোনাস আই / ও বিজ্ঞপ্তির জন্য। নোড তার জন্য libuv আছে। নোড পুরোপুরি ইউজারল্যান্ডে রয়েছে। এটি কার্নেল প্রয়োগ করে তার উপর নির্ভর করে না।
ব্যবহারকারী568109

1
@ user568109, লিবুভ হ'ল নোডের মধ্যবিত্ত। যে কোনও অ্যাসিনক্রোনাস ফ্রেমওয়ার্ক কার্নেলের কিছু অ্যাসিনক্রোনাস I / O সমর্থনের উপর নির্ভর করে (সরাসরি বা না)। তাই?
রবার্ট সিমার

বিভ্রান্তির জন্য দুঃখিত. সকেট ক্রিয়াকলাপগুলি কার্নেল থেকে আই / ওকে অবরুদ্ধকরণের প্রয়োজন। এটি অ্যাসিক্রোনাস হ্যান্ডলিংয়ের যত্ন নেয়। তবে অ্যাসিঙ্ক্রোনাস ফাইল I / O নিজেই লিবুভ দ্বারা পরিচালিত হয়। আপনার উত্তরটি তা বলে না। এটি কার্নেল দ্বারা পরিচালিত উভয় হিসাবে একই আচরণ করে।
user568109
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.