নোডেজ ইভেন্ট লুপ


141

নোডেজ আর্কিটেকচারে অভ্যন্তরীণভাবে দুটি ইভেন্ট লুপ রয়েছে?

  • libev / libuv
  • v8 জাভাস্ক্রিপ্ট ইভেন্ট লুপ

আই / ও অনুরোধে নোড কি লিবির অনুরোধের অনুরোধ করে যা পরিবর্তনের মাধ্যমে লিবভ ব্যবহার করে ইভেন্টগুলির মাধ্যমে ডেটার উপস্থিতিটি সূচিত করে এবং শেষ পর্যন্ত সেই ইভেন্টগুলি কল-ব্যাক ব্যবহার করে ভি 8 ইভেন্ট লুপ দ্বারা পরিচালিত হয়?

মূলত, কিভাবে নোডেজ আর্কিটেকচারে লিভভ এবং লিবিও সংহত হয়?

নোডেজের অভ্যন্তরীণ আর্কিটেকচারের স্পষ্ট চিত্র দেওয়ার জন্য কি কোনও ডকুমেন্টেশন উপলব্ধ?

উত্তর:


175

আমি ব্যক্তিগতভাবে node.js এবং v8 এর উত্স কোডটি পড়ছি।

নেটিভ মডিউলগুলি লেখার জন্য আমি যখন নোড.জেএস আর্কিটেকচারটি বোঝার চেষ্টা করেছি তখন আমি আপনার মতো একই সমস্যার মধ্যে পড়েছিলাম।

আমি এখানে যা পোস্ট করছি তা হ'ল নোড.জেএস সম্পর্কে আমার বোঝাপড়া এবং এটি কিছুটা ট্র্যাকও হতে পারে।

  1. লিবিভ হল ইভেন্ট লুপ যা সাধারণ ইভেন্ট লুপ ক্রিয়াকলাপ সম্পাদন করতে আসলে নোড.জেজে অভ্যন্তরীণভাবে চালিত হয়। এটি মূলত * নিক্স সিস্টেমের জন্য লেখা। প্রক্রিয়াটি চালুর জন্য লিবিভ একটি সাধারণ তবে অনুকূলিত ইভেন্ট লুপ সরবরাহ করে। আপনি এখানে লিভভ সম্পর্কে আরও পড়তে পারেন ।

  2. লিবিওইও একটি লাইব্রেরি যা ইনপুট আউটপুট অসম্পূর্ণভাবে সম্পাদন করে। ফাইল বর্ণনাকারী, ডাটা হ্যান্ডেলার, সকেট ইত্যাদি আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন পরিচালনা এখানে

  3. লিবিউভি লিবিও, লিভভ, সি-আরস (ডিএনএসের জন্য) এবং আইওসিপি (উইন্ডোজ অ্যাসিঙ্ক্রোনাস-আইও) এর শীর্ষে একটি বিমূর্ত স্তর। LibUv ইভেন্ট পুলের সমস্ত io এবং ইভেন্টগুলি সম্পাদন করে, পরিচালনা করে এবং পরিচালনা করে। (লিবিও থ্রেডপুলের ক্ষেত্রে)। LibUv- এ আপনার রায়ান ডাহলের টিউটোরিয়ালটি পরীক্ষা করা উচিত । এটি আপনাকে কীভাবে libUv কাজ করে এবং আরও নোড.জেএস কীভাবে লিবুভ এবং ভি 8 এর শীর্ষে কাজ করে তা আপনি বুঝতে পারবেন।

কেবল জাভাস্ক্রিপ্ট ইভেন্টের লুপটি বুঝতে আপনার এই ভিডিওগুলি দেখার বিষয়টি বিবেচনা করা উচিত

অ্যাসিঙ্ক মডিউলগুলি তৈরি করতে নোড.জেএস এর সাথে লিবিও কীভাবে ব্যবহৃত হয় তা দেখতে আপনার এই উদাহরণটি দেখতে হবে ।

মূলত নোড.জেএস এর অভ্যন্তরে যা ঘটে তা হ'ল ভি 8 লুপটি সমস্ত জাভাস্ক্রিপ্ট অংশ পাশাপাশি সি ++ মডিউলগুলি পরিচালনা করে [যখন তারা একটি মূল থ্রেডে চলতে থাকে (অফিসিয়াল ডকুমেন্টেশন নোড.জেএস অনুযায়ী নিজেই একক থ্রেডযুক্ত থাকে]]। মূল থ্রেডের বাইরে গেলে, লিভভ এবং লিবিও থ্রেড পুলে এটি পরিচালনা করে এবং লিবভ মূল লুপের সাথে ইন্টারঅ্যাকশন সরবরাহ করে। সুতরাং আমার বোধগম্যতা থেকে, নোড.জেএস এর 1 টি স্থায়ী ইভেন্ট লুপ রয়েছে: এটি ভি 8 ইভেন্ট লুপ। সি ++ অ্যাসিঙ্ক কার্যগুলি পরিচালনা করতে এটি একটি থ্রেডপুল ব্যবহার করছে [লিবিও এবং ল্যাভভের মাধ্যমে]।

উদাহরণ স্বরূপ:

eio_custom(Task,FLAG,AfterTask,Eio_REQUEST);

যা সমস্ত মডিউলে প্রদর্শিত হয় সাধারণত Taskথ্রেডপুলে ফাংশনটি কল করে । এটি সম্পূর্ণ হয়ে গেলে এটি AfterTaskফাংশনটিকে মূল থ্রেডে কল করে । যেখানে Eio_REQUESTঅনুরোধ হ্যান্ডলারটি এমন কোনও কাঠামো / অবজেক্ট হতে পারে যার উদ্দেশ্য থ্রেডপুল এবং মূল থ্রেডের মধ্যে যোগাযোগ সরবরাহ করা।


আপনার কোডটি প্লাটফর্মটি ক্রস না ​​করে করার জন্য লিবুভ অভ্যন্তরীণভাবে লিভব ব্যবহার করে তা নির্ভর করে। আপনার কেবল লিবুভের পাবলিক ইন্টারফেস সম্পর্কে যত্ন নেওয়া উচিত।
রায়নস

1
@ রায়নস লিবুভ এর এক্স-প্ল্যাটফাউজিং একাধিক লাইব্রেরি নিশ্চিত করা লক্ষ্য করে। ঠিক? সুতরাং লিবুভ ব্যবহার করা একটি ভাল ধারণা
শ্রেকওভারফ্লো

1
@ দোষ থেকে অভিষেক process.nextTick- ইভেন্ট লুপের পরবর্তী লুপটিতে এই কলব্যাকটি কল করুন। এটি টাইমআউট (এফএনএল, 0) এর সরল উপকরণ নয়, এটি আরও কার্যকর। এটি কোন ইভেন্টের লুপটি উল্লেখ করে? ভি 8 ইভেন্ট লুপ?
তামিল

2
নোট করুন যে libuv আর আরম্ভের উপর প্রয়োগ করা হয় না
strcat

4
এই ইভেন্টের সারিটি 'দেখার' উপায় আছে কি? আইডিকে স্ট্যাকের উপর কলগুলির ক্রম দেখতে এবং নতুন ঘটনাগুলি কী ঘটছে তা আরও ভালভাবে বোঝার জন্য সেখানে চাপ দেওয়া হচ্ছে তা দেখতে পছন্দ করতে চান ... এমন কিছু ভেরিয়েবল রয়েছে যা আপনাকে ইভেন্ট কাতারে কী চাপানো হয়েছে তা বলে দেয়?
tbarbe

20

দেখে মনে হচ্ছে কিছু আলোচিত সত্ত্বা যেমন (যেমন: লভভ ইত্যাদি) প্রাসঙ্গিকতা হারিয়েছে, কারণ এটি কিছুটা সময় হয়ে গেছে, তবে আমি মনে করি এখনও প্রশ্নটির যথেষ্ট সম্ভাবনা রয়েছে।

আমি আজ অবধি নোডের প্রসঙ্গে, একটি বিমূর্ত উদাহরণের সাহায্যে ইভেন্ট চালিত মডেলটির কাজ ব্যাখ্যা করার চেষ্টা করি।

প্রোগ্রামের দৃষ্টিভঙ্গি:

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

উপরের ইভেন্টের যন্ত্রপাতিটিকে লাইবভ একেএ ইভেন্ট লুপ ফ্রেমওয়ার্ক বলা হয়। নোড এই ইভেন্টটি চালিত প্রোগ্রামিং মডেলটি বাস্তবায়নের জন্য এই লাইব্রেরিটি ব্যবহার করে।

নোডের দৃষ্টিভঙ্গি:

  • রানটাইম হোস্ট করার জন্য একটি থ্রেড রাখুন।
  • ব্যবহারকারীর স্ক্রিপ্টটি তুলে নিন।
  • এটিকে স্থানীয়ভাবে সংগ্রহ করুন [উত্তোলন v8]
  • বাইনারি লোড করুন, এবং এন্ট্রি পয়েন্টে ঝাঁপুন।
  • সংকলিত কোড প্রোগ্রামিং আদিম ব্যবহার করে লাইনে সিপিইউউড ক্রিয়াকলাপগুলি কার্যকর করে।
  • অনেকগুলি I / O এবং টাইমার সম্পর্কিত কোডের দেশীয় মোড়ক থাকে। উদাহরণস্বরূপ, নেটওয়ার্ক I / O।
  • সুতরাং I / O কলগুলি স্ক্রিপ্ট থেকে সি ++ সেতুগুলিতে রূপান্তরিত হয়, আই / ও হ্যান্ডেল এবং সমাপ্তি হ্যান্ডলারটি আর্গুমেন্ট হিসাবে পাস করে।
  • নেটিভ কোড লাইবুভ লুপটি ব্যবহার করে। এটি লুপটি অর্জন করে, একটি নিম্ন স্তরের ইভেন্ট সজ্জিত করে যা আই / ও উপস্থাপন করে এবং লিবুভ লুপ স্ট্রাকচারে একটি নেটিভ কলব্যাক র‌্যাপার।
  • নেটিভ কোড স্ক্রিপ্টে ফিরে আসে - এই মুহুর্তে কোনও আই / ও নেওয়া হয় না!
  • উপরের আইটেমগুলি বহুবার পুনরাবৃত্তি করা হয়, যতক্ষণ না সমস্ত অ-আই / ও কোড কার্যকর করা হয়, এবং সমস্ত আই / ও কোড নিবন্ধিত হয় লিবুব।
  • অবশেষে, যখন সিস্টেমে কার্যকর করার মতো কিছুই অবশিষ্ট থাকে না, নোড নিয়ন্ত্রণটি লাইবউভকে দেয়
  • লিবুভ অ্যাকশনে আসে, এটি সমস্ত নিবন্ধিত ইভেন্টগুলিকে তুলে ধরে, অপারেটিং সিস্টেমটিকে তাদের অপারেবিলিটি পেতে জিজ্ঞাসা করে।
  • অ-ব্লকিং মোডে যা I / O এর জন্য প্রস্তুত, তাদের তুলে নেওয়া হয়, I / O সম্পাদিত হয় এবং তাদের কলব্যাকস জারি করা হয়। একটার পর অন্যটা.
  • যেগুলি এখনও প্রস্তুত নয় (উদাহরণস্বরূপ একটি সকেট পঠিত, যার জন্য অন্য শেষ পয়েন্টটি এখনও কিছু লিখেনি) উপলব্ধ না হওয়া পর্যন্ত ওএসের সাথে তদন্ত করা অবিরত থাকবে।
  • লুপটি অভ্যন্তরীণভাবে একটি ক্রমবর্ধমান টাইমার বজায় রাখে। যখন ডিফার্ড কলব্যাকের জন্য অ্যাপ্লিকেশন অনুরোধ করে (যেমন সেটটাইমআউট), কলব্যাক ফায়ার করার জন্য এই অভ্যন্তরীণ টাইমার মানটি সঠিক সময় গণনা করার জন্য নেওয়া হয়।

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

আশাকরি এটা সাহায্য করবে.


আপনি এই জিনিসগুলি কীভাবে জানলেন, আপনি আমাকে উত্সকে নির্দেশ করতে পারেন?
সুরজ জৈন

18

Libuv একটি ভূমিকা

Node.js প্রকল্পের 2009 সালে শুরু একটি JavaScript পরিবেশ যেমন ব্রাউজার থেকে পৃথক। গুগলের ভি 8 এবং মার্ক লেহম্যানের লিভভ ব্যবহার করে , নোড.জেস আই / ও - সান্ধ্য - এর একটি মডেলকে একত্রিত করে এমন একটি ভাষার সাথে মিলিয়ে দেয় যা প্রোগ্রামিংয়ের স্টাইলে উপযুক্ত ছিল; এটি ব্রাউজারগুলির দ্বারা আকৃতির হয়ে যাওয়ার কারণে। নোড.জেএস জনপ্রিয়তার সাথে বাড়ার সাথে সাথে এটি উইন্ডোজে কাজ করা গুরুত্বপূর্ণ ছিল, তবে লিভভ কেবল ইউনিক্সে চলেছিল। উইন্ডোজ সমতুল্য কার্নেল ইভেন্ট নোটিফিকেশন প্রক্রিয়াগুলির মতো কোকিউ বা (ই) পোল আইওসিপি। libuv ল্যাভভ বা আইওসিপি প্ল্যাটফর্মের উপর নির্ভর করে একটি বিমূর্ততা ছিল, ব্যবহারকারীদের লিভভ ভিত্তিক একটি এপিআই সরবরাহ করে। নোড-ভি0.৯.০ সংস্করণে লিবুভ লিভভ সরানো হয়েছে

এছাড়াও একটি ছবি যা নোড.জেজে ইভেন্ট ব্যাকটি বর্ণনা করে @ ব্যাসিরিচ দ্বারা


05/09/2017 আপডেট

এই নথ নোড.জেএস প্রতি ইভেন্ট লুপ ,

নিম্নলিখিত চিত্রটি ইভেন্ট লুপের ক্রিয়াকলাপের ক্রমটির একটি সরল ওভারভিউ দেখায়।

   ┌───────────────────────┐
┌─>│        timers         
  └──────────┬────────────┘
  ┌──────────┴────────────┐
       I/O callbacks     
  └──────────┬────────────┘
  ┌──────────┴────────────┐
       idle, prepare     
  └──────────┬────────────┘      ┌───────────────┐
  ┌──────────┴────────────┐         incoming:   
           poll          │<─────┤  connections, 
  └──────────┬────────────┘         data, etc.  
  ┌──────────┴────────────┐      └───────────────┘
          check          
  └──────────┬────────────┘
  ┌──────────┴────────────┐
└──┤    close callbacks    
   └───────────────────────┘

দ্রষ্টব্য: প্রতিটি বাক্স ইভেন্ট লুপের "ফেজ" হিসাবে উল্লেখ করা হবে।

পর্যায়ের পর্যালোচনা

  • টাইমার : এই ধাপটি নির্ধারিত কলব্যাকগুলি সম্পাদন করে setTimeout()এবং দ্বারা setInterval()
  • আই / ও কলব্যাকস : ঘনিষ্ঠ কলব্যাকগুলি ব্যতীত প্রায় সকল কলব্যাকগুলি কার্যকর করে, টাইমার অনুসারে নির্ধারিত এবং setImmediate()
  • অলস, প্রস্তুত : কেবল অভ্যন্তরীণভাবে ব্যবহৃত used
  • পোল : নতুন আই / ও ইভেন্টগুলি পুনরুদ্ধার করুন; নোড এখানে উপযুক্ত হবে যখন ব্লক হবে।
  • চেক করুন : setImmediate()কলব্যাকগুলি এখানে অনুরোধ করা হয়েছে।
  • ঘনিষ্ঠ callbacks : যেমন socket.on('close', ...)

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


আপনি এটি উদ্ধৃত করেছেন " In the node-v0.9.0 version of libuv libev was removed", তবে নোডেজে এটি সম্পর্কে কোনও বিবরণ নেই changeloggithub.com/nodejs/node/blob/master/CHANGELOG.md । এবং যদি লিভভ সরানো হয় তবে এখন নোডেজগুলিতে অ্যাসিঙ্ক আই / ও সঞ্চালিত হচ্ছে কীভাবে?
ইত্তেখাব

@ ইন্তেখাব, এই লিঙ্কটি অনুসারে , আমি মনে করি লিবিও ভিত্তিক লিবুবটি নোড.জেএস-তে ইভেন্ট লুপ হিসাবে ব্যবহৃত হতে পারে think
zangw

@ ইন্টেখাব আমার মনে হয় লিবুভ আই / ও এবং ভোটদান সম্পর্কিত সমস্ত বৈশিষ্ট্য প্রয়োগ করছে। এই দস্তাবেজটি এখানে দেখুন: docs.libuv.org/en/v1.x/loop.html
মোহিত কৌশিক

13

নোডজেস আর্কিটেকচারে একটি ইভেন্ট লুপ রয়েছে।

নোড.জেএস ইভেন্ট লুপ মডেল

নোড অ্যাপ্লিকেশনগুলি একক থ্রেডযুক্ত ইভেন্ট-চালিত মডেলটিতে চলে। তবে নোড ব্যাকগ্রাউন্ডে একটি থ্রেড পুল প্রয়োগ করে যাতে কাজ সম্পাদন করা যায়।

নোড.জেএস একটি ইভেন্টের সারিতে কাজ যুক্ত করে এবং তারপরে একটি ইভেন্টের লুপটি চালায় এমন একক থ্রেড থাকে। ইভেন্টের লুপ ইভেন্টের কাতারে শীর্ষ আইটেমটি ধরে ফেলে, এটি সম্পাদন করে এবং তারপরে পরবর্তী আইটেমটি ধরে।

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

যখন আমাদের অ্যাপ্লিকেশন ফাংশন I / O- এ অবরুদ্ধ হয় তখন ইভেন্ট লুপটি বিপজ্জনক সমস্যা শুরু করে।

নোড.জেএস I / O- কে ব্লক করার জন্য অপেক্ষা না করতে ইভেন্ট ইভেন্ট কলব্যাকগুলি ব্যবহার করে। অতএব, যে কোনও অনুরোধগুলি I / O ব্লক করে তা পটভূমিতে একটি ভিন্ন থ্রেডে সম্পাদিত হয়।

যখন কোনও ইভেন্ট আই / ওকে অবরুদ্ধ করে ইভেন্ট ইভেন্ট থেকে সরিয়ে নেওয়া হয়, নোড.জেএস থ্রেড পুল থেকে একটি থ্রেড পুনরুদ্ধার করে এবং সেখানে মূল ইভেন্ট লুপ থ্রেডের পরিবর্তে ফাংশনটি সম্পাদন করে utes এটি ইভেন্ট সারিতে থাকা অন্যান্য ইভেন্টগুলি ধরে রাখতে I / O- কে ব্লক করা বাধা দেয়।


8

লিবুভ দ্বারা সরবরাহ করা কেবলমাত্র একটি ইভেন্টের লুপ রয়েছে, ভি 8 হ'ল একটি জেএস রানটাইম ইঞ্জিন।


1

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

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

0

pbkdf2ফাংশন জাভাস্ক্রিপ্ট বাস্তবায়ন রয়েছে কিন্তু এটা আসলে প্রতিনিধিদের সব কাজ সি ++ পাশ থেকে কাজ করতে হবে।

env->SetMethod(target, "pbkdf2", PBKDF2);
  env->SetMethod(target, "generateKeyPairRSA", GenerateKeyPairRSA);
  env->SetMethod(target, "generateKeyPairDSA", GenerateKeyPairDSA);
  env->SetMethod(target, "generateKeyPairEC", GenerateKeyPairEC);
  NODE_DEFINE_CONSTANT(target, OPENSSL_EC_NAMED_CURVE);
  NODE_DEFINE_CONSTANT(target, OPENSSL_EC_EXPLICIT_CURVE);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS1);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS8);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingSPKI);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingSEC1);
  NODE_DEFINE_CONSTANT(target, kKeyFormatDER);
  NODE_DEFINE_CONSTANT(target, kKeyFormatPEM);
  NODE_DEFINE_CONSTANT(target, kKeyTypeSecret);
  NODE_DEFINE_CONSTANT(target, kKeyTypePublic);
  NODE_DEFINE_CONSTANT(target, kKeyTypePrivate);
  env->SetMethod(target, "randomBytes", RandomBytes);
  env->SetMethodNoSideEffect(target, "timingSafeEqual", TimingSafeEqual);
  env->SetMethodNoSideEffect(target, "getSSLCiphers", GetSSLCiphers);
  env->SetMethodNoSideEffect(target, "getCiphers", GetCiphers);
  env->SetMethodNoSideEffect(target, "getHashes", GetHashes);
  env->SetMethodNoSideEffect(target, "getCurves", GetCurves);
  env->SetMethod(target, "publicEncrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
                                         EVP_PKEY_encrypt_init,
                                         EVP_PKEY_encrypt>);
  env->SetMethod(target, "privateDecrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
                                         EVP_PKEY_decrypt_init,
                                         EVP_PKEY_decrypt>);
  env->SetMethod(target, "privateEncrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
                                         EVP_PKEY_sign_init,
                                         EVP_PKEY_sign>);
  env->SetMethod(target, "publicDecrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
                                         EVP_PKEY_verify_recover_init,
                                         EVP_PKEY_verify_recover>);

সম্পদ: https://github.com/nodejs/node/blob/master/src/node_crypto.cc

লিবিভ মডিউলের আরও একটি দায়িত্ব রয়েছে যা স্ট্যান্ডার্ড লাইব্রেরিতে কিছু বিশেষ কাজের জন্য প্রাসঙ্গিক।

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

পরিবর্তে তারা থ্রেড পুল নামক কিছু ব্যবহার করে, থ্রেড পুলটি চারটি থ্রেডের একটি সিরিজ যা গণনার ক্ষেত্রে ব্যয়বহুল কাজগুলি চালনার জন্য ব্যবহার করা যেতে পারে pbkdf2 ফাংশন ।

ডিফল্টরূপে লিবুভ এই থ্রেড পুলে 4 টি থ্রেড তৈরি করে।

ইভেন্ট লুপে ব্যবহৃত থ্রেড ছাড়াও আরও চারটি থ্রেড রয়েছে যা আমাদের অ্যাপ্লিকেশনের অভ্যন্তরে ব্যয়বহুল গণনাগুলি অফলোড করতে ব্যবহার করা যেতে পারে।

নোড স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত অনেকগুলি ফাংশন স্বয়ংক্রিয়ভাবে এই থ্রেড পুলটি ব্যবহার করে। দ্যpbkdf2ফাংশন তাদের মধ্যে একজন হচ্ছে।

এই থ্রেড পুলের উপস্থিতি খুব তাৎপর্যপূর্ণ।

সুতরাং নোড প্রকৃতপক্ষে একক থ্রেডেড নয়, কারণ নোট কিছু সংখ্যক ব্যয়বহুল কাজ করার জন্য নোড ব্যবহার করে।

যদি ইভেন্ট পুলটি গণনামূলকভাবে ব্যয়বহুল কাজটি করার জন্য দায়বদ্ধ ছিল, তবে আমাদের নোড অ্যাপ্লিকেশনটি আর কিছুই করতে পারে না।

আমাদের সিপিইউ এক এক করে থ্রেডের ভিতরে সমস্ত নির্দেশনা চালায়।

থ্রেড পুল ব্যবহার করে আমরা গণনা হওয়ার সময় ইভেন্ট লুপের ভিতরে অন্যান্য জিনিসগুলি করতে পারি।

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