নোডের সম্পূর্ণ আলাদা দৃষ্টান্ত রয়েছে এবং একবারে এটি সঠিকভাবে ধরা পড়লে সমস্যা সমাধানের এই ভিন্ন উপায়টি দেখা সহজ। আপনার কোনও নোড অ্যাপ্লিকেশন (1) এ কখনও একাধিক থ্রেডের প্রয়োজন হবে না কারণ আপনার একই কাজ করার একটি ভিন্ন উপায় রয়েছে। আপনি একাধিক প্রক্রিয়া তৈরি; তবে এটি তুলনায় খুব আলাদা, উদাহরণস্বরূপ, অ্যাপাচি ওয়েব সার্ভারের প্রিফোর্ক এমপিএম কীভাবে করে।
আপাতত, আসুন আমরা ভাবি যে আমাদের কেবল একটি সিপিইউ কোর রয়েছে এবং আমরা কিছু কাজ করার জন্য একটি অ্যাপ্লিকেশন (নোডের পথে) বিকাশ করব। আমাদের কাজটি হ'ল একটি বড় ফাইলের প্রসেসটি বাই-বাই বাইট এর বিষয়বস্তুগুলিতে চলছে। আমাদের সফ্টওয়্যারটির সর্বোত্তম উপায় হ'ল ফাইলের শুরু থেকে কাজ শুরু করা, এটি বাই-বাই-বাই অনুসরণ করুন।
- আরে, হাসান, আমি মনে করি আপনি আমার নানার সময় থেকেই নবাগত বা খুব পুরানো স্কুল !!! আপনি কিছু থ্রেড তৈরি এবং এটি আরও দ্রুত তৈরি করেন না কেন?
- ওহ, আমাদের কেবল একটি সিপিইউ কোর আছে।
-- তাতে কি? কিছু থ্রেড তৈরি করুন ম্যান, এটি দ্রুত করুন!
- এটি এর মতো কাজ করে না। যদি আমি থ্রেড তৈরি করি তবে আমি এটিকে আরও ধীর করব। কারণ আমি থ্রেডগুলির মধ্যে স্যুইচ করার জন্য সিস্টেমে প্রচুর ওভারহেড যুক্ত করব, তাদের যথেষ্ট পরিমাণ সময় দেওয়ার চেষ্টা করব এবং আমার প্রক্রিয়াটির মধ্যে এই থ্রেডগুলির মধ্যে যোগাযোগের চেষ্টা করব। এই সমস্ত সত্যের পাশাপাশি, আমি কীভাবে একটি একক কাজকে একাধিক টুকরোতে ভাগ করব যা সমান্তরালভাবে করা যায় সে সম্পর্কেও আমাকে ভাবতে হবে।
- ঠিক আছে ঠিক আছে, আমি দেখছি তুমি দরিদ্র। আসুন আমার কম্পিউটারটি ব্যবহার করা যাক, এতে 32 টি কোর রয়েছে!
- বাহ, আপনি দুর্দান্ত বন্ধু আমার প্রিয় বন্ধু, আপনাকে অনেক ধন্যবাদ। আমি এটিকে সমর্থন করি!
তারপরে আমরা কাজে ফিরে যাই। এখন আমাদের 32 জন সিপিইউ কোর রয়েছে আমাদের সমৃদ্ধ বন্ধুকে ধন্যবাদ। আমাদের যে বিধিগুলি মেনে চলতে হবে তা সবেমাত্র পরিবর্তিত হয়েছে। আমাদের দেওয়া সমস্ত সম্পদ এখন আমরা কাজে লাগাতে চাই।
একাধিক কোর ব্যবহার করার জন্য, আমাদের কাজগুলিকে টুকরো টুকরো করে বিভক্ত করার একটি উপায় খুঁজে বের করতে হবে যা আমরা সমান্তরালে পরিচালনা করতে পারি। যদি এটি নোড না হয় তবে আমরা এর জন্য থ্রেড ব্যবহার করব; 32 থ্রেড, প্রতিটি সিপিইউ কোরের জন্য একটি। তবে, যেহেতু আমাদের নোড রয়েছে তাই আমরা 32 নোড প্রক্রিয়া তৈরি করব।
থ্রেড নোড প্রক্রিয়াগুলির জন্য একটি ভাল বিকল্প হতে পারে, আরও ভাল উপায় হতে পারে; তবে কেবলমাত্র নির্দিষ্ট ধরণের কাজের ক্ষেত্রে যেখানে কাজটি ইতিমধ্যে সংজ্ঞায়িত হয়েছে এবং কীভাবে এটি পরিচালনা করবেন তার উপর আমাদের সম্পূর্ণ নিয়ন্ত্রণ রয়েছে। এগুলি ছাড়াও, অন্যান্য যে কোনও সমস্যার জন্যই বাইরে থেকে কাজটি এমনভাবে আসে যেখানে আমাদের নিয়ন্ত্রণ থাকে না এবং আমরা যত তাড়াতাড়ি সম্ভব উত্তর দিতে চাই, নোডের উপায়টি নিরপেক্ষভাবে উন্নত।
- আরে, হাসান, আপনি এখনও একক থ্রেডযুক্ত কাজ করছেন? কি হয়েছে তোমার? আপনি যা চেয়েছিলেন তা আমি আপনাকে কেবল সরবরাহ করেছি। আপনার আর কোনও অজুহাত নেই। থ্রেড তৈরি করুন, এটি দ্রুত চালিত করুন।
- আমি কাজটি টুকরো টুকরো করে ফেলেছি এবং প্রতিটি প্রক্রিয়া এই টুকরোগুলির একটিতে সমান্তরালে কাজ করবে।
- আপনি থ্রেড তৈরি করেন না কেন?
- দুঃখিত, আমি এটি ব্যবহারযোগ্য বলে মনে করি না। আপনি চাইলে আপনার কম্পিউটার নিতে পারবেন?
- না ঠিক আছে, আমি শান্ত, আমি শুধু বুঝতে পারি না আপনি থ্রেড ব্যবহার করেন না কেন?
- কম্পিউটারের জন্য আপনাকে ধন্যবাদ। :) আমি ইতিমধ্যে কাজটিকে টুকরো টুকরো করে ফেলেছি এবং আমি এই টুকরোগুলিকে সমান্তরালভাবে কাজ করার প্রক্রিয়া তৈরি করি। সমস্ত সিপিইউ কোর পুরোপুরি ব্যবহার করা হবে। আমি প্রক্রিয়াগুলির পরিবর্তে থ্রেড দিয়ে এটি করতে পারি; তবে নোডের এই পথ রয়েছে এবং আমার বস পার্থ ঠাকর চান যে আমি নোড ব্যবহার করব।
- ঠিক আছে, আপনার যদি অন্য কম্পিউটারের দরকার হয় তবে আমাকে জানান। : P
যদি আমি ৩৩ টির পরিবর্তে ৩৩ টি প্রক্রিয়া তৈরি করি তবে অপারেটিং সিস্টেমের শিডিয়ুলার একটি থ্রেড থামিয়ে দিবে, অন্যটি শুরু করবে, কিছু চক্রের পরে বিরতি দিন, অন্যটি আবার শুরু করুন ... এটি অপ্রয়োজনীয় ওভারহেড। আমি এটা চাই না. বস্তুত, 32 কোর কোনো সিস্টেমে, আমি ঠিক 32 প্রসেস তৈরি করতে চান না, 31 হতে পারে সুন্দর । কারণ কেবলমাত্র আমার অ্যাপ্লিকেশনই এই সিস্টেমে কাজ করবে না। অন্যান্য জিনিসের জন্য একটু ঘর রেখে দেওয়া ভাল হতে পারে, বিশেষত যদি আমাদের কাছে 32 টি রুম থাকে।
আমি বিশ্বাস করি সিপিইউ-নিবিড় কাজের জন্য প্রসেসরগুলির পুরোপুরি ব্যবহার সম্পর্কে আমরা এখন একই পৃষ্ঠায় আছি ।
- হুম, হাসান, তোমাকে একটু উপহাস করার জন্য আমি দুঃখিত sorry আমি বিশ্বাস করি আমি আপনাকে এখন আরও ভাল করে বুঝতে পারি। তবে এর জন্য আমার এখনও একটি ব্যাখ্যা দরকার এমন কিছু আছে: কয়েকশ থ্রেড চালানো সম্পর্কে সমস্ত গুঞ্জন কী? আমি সর্বত্রই পড়েছি যে থ্রেডগুলি তৈরির প্রক্রিয়াগুলির তুলনায় ফর্ম এবং বোবা আরও দ্রুততর? আপনি থ্রেডের পরিবর্তে প্রক্রিয়াগুলি কাঁটাচামচ করেন এবং আপনি নোডের সাথে সর্বাধিক পাওয়া উচিত বলে মনে করেন। তাহলে নোড কি এই ধরণের কাজের জন্য উপযুক্ত নয়?
- কোনও উদ্বেগ নেই, আমিও শান্ত। প্রত্যেকেই এই কথাগুলি বলে তাই আমার মনে হয় আমি সেগুলি শুনতে অভ্যস্ত।
- তাই তো? নোড এই জন্য ভাল না?
- থ্রেডগুলিও ভাল হতে পারে যদিও নোড এটির জন্য পুরোপুরি ভাল। থ্রেড / প্রক্রিয়া তৈরির ওভারহেড হিসাবে; আপনি যে জিনিসগুলিকে প্রচুর পুনরাবৃত্তি করেন সেগুলিতে প্রতিটি মিলিসেকেন্ড গণনা করে। যাইহোক, আমি কেবল 32 টি প্রক্রিয়া তৈরি করি এবং এতে অল্প পরিমাণ সময় লাগবে। এটি একবারেই ঘটবে। এতে কোনও তফাত হবে না।
- আমি কখন হাজার হাজার থ্রেড তৈরি করতে চাই?
- আপনি কখনও হাজার হাজার থ্রেড তৈরি করতে চান না। যাইহোক, এমন কোনও সিস্টেমে যা কাজ করে যা বাইরে থেকে আসে যেমন কোনও ওয়েব সার্ভারের মতো HTTP অনুরোধগুলি প্রক্রিয়া করে; আপনি যদি প্রতিটি অনুরোধের জন্য কোনও থ্রেড ব্যবহার করছেন তবে আপনি প্রচুর থ্রেড তৈরি করবেন them
- নোড যদিও আলাদা? রাইট?
-- হ্যাঁ অবশ্যই. এখানেই নোড সত্যিই জ্বলজ্বল করে। কোনও থ্রেড যেমন প্রক্রিয়াটির চেয়ে অনেক হালকা হয় তেমনি একটি ফাংশন কল থ্রেডের চেয়েও হালকা। নোড থ্রেড তৈরির পরিবর্তে ফাংশনগুলিকে কল করে। ওয়েব সার্ভারের উদাহরণে, প্রতিটি আগত অনুরোধের ফলে একটি ফাংশন কল হয়।
- হুঁ, আকর্ষণীয়; তবে আপনি যদি একাধিক থ্রেড ব্যবহার না করেন তবে আপনি কেবল একই সময়ে একটি ফাংশন পরিচালনা করতে পারেন। যখন একই সাথে প্রচুর অনুরোধগুলি ওয়েব সার্ভারে উপস্থিত হয় তখন এটি কীভাবে কাজ করতে পারে?
- ফাংশনগুলি কীভাবে সঞ্চালিত হয় সে সম্পর্কে আপনি পুরোপুরি সঠিক, এক সময়ে একবার, সমান্তরালে কখনই দুটি নয়। আমি একক প্রক্রিয়া বলতে চাইছি, কোডের একমাত্র স্কোপ এক সাথে চলছে। ওএস সিডিউলার এসে এই ফাংশনটি বিরতি দেয় না এবং অন্য একটিতে স্যুইচ করে না, যদি না এটি আমাদের প্রক্রিয়াতে অন্য থ্রেড নয়, অন্য প্রক্রিয়াতে সময় দেওয়ার জন্য প্রক্রিয়াটি বিরতি দেয়। (2)
- তাহলে কীভাবে কোনও প্রক্রিয়া একবারে 2 টি অনুরোধ পরিচালনা করতে পারে?
- আমাদের সিস্টেমে পর্যাপ্ত সংস্থান (র্যাম, নেটওয়ার্ক ইত্যাদি) যতক্ষণ না এক প্রক্রিয়া একসাথে কয়েক হাজার অনুরোধগুলি পরিচালনা করতে পারে। কীভাবে এই ফাংশনগুলি চালিত হয় তা কী ডিফারেন্স।
- হুম, এখন কি আমার উত্তেজিত হওয়া উচিত?
- হতে পারে :) নোড একটি সারি ধরে একটি লুপ চালায়। এই কাতারে রয়েছে আমাদের কাজগুলি, যেমন, কলগুলি আমরা আগত অনুরোধগুলি প্রক্রিয়া করতে শুরু করি। এখানে সর্বাধিক গুরুত্বপূর্ণ বিষয়টি হ'ল আমরা আমাদের ফাংশনগুলি চালানোর জন্য ডিজাইন করি। কোনও অনুরোধ প্রক্রিয়া শুরু করার পরিবর্তে এবং কলারটি আমাদের কাজ শেষ না হওয়া পর্যন্ত অপেক্ষা করার পরিবর্তে, আমরা গ্রহণযোগ্য পরিমাণ কাজ করার পরে দ্রুত আমাদের ফাংশনটি শেষ করি। যখন আমরা এমন একটি জায়গায় পৌঁছে যাই যেখানে আমাদের অন্য উপাদানটির জন্য কিছু কাজ করার জন্য অপেক্ষা করতে হবে এবং আমাদের একটি মান ফিরিয়ে দিতে হবে, তার অপেক্ষা না করে আমরা কেবল বাকী কাজ সারিতে যুক্ত করে কেবল আমাদের ফাংশন শেষ করি।
- খুব জটিল মনে হচ্ছে?
- না না, আমি জটিল শুনতে পাচ্ছি; তবে সিস্টেম নিজেই খুব সহজ এবং এটি সঠিক ধারণা দেয়।
এখন আমি এই দুটি বিকাশকারীদের মধ্যে কথোপকথনের উদ্ধৃতি বন্ধ করতে চাই এবং এই ফাংশনগুলি কীভাবে কাজ করে তার এক চটজলদি উদাহরণের পরে আমার উত্তরটি শেষ করতে চাই।
এইভাবে, আমরা ওএস শিডিয়ুলার সাধারণত যা করত তা করছি। আমরা আমাদের কাজটি এক পর্যায়ে বিরতি দিয়েছি এবং অন্য ফাংশন কলগুলি (বহু-থ্রেডযুক্ত পরিবেশে অন্যান্য থ্রেডের মতো) চলতে দেওয়া যাক আমরা আবার আমাদের টার্ন না পাওয়া পর্যন্ত। এটি ওএস সিডিউলারের কাজ ছেড়ে দেওয়ার চেয়ে অনেক ভাল যা সিস্টেমে প্রতিটি থ্রেডকে ঠিক সময় দেওয়ার চেষ্টা করে। ওএস শিডিউলারের চেয়ে আমরা কী আরও ভাল করছি তা আমরা জানি এবং আমাদের কখন থামানো উচিত তা প্রত্যাশা করা হয়।
নীচে একটি সহজ উদাহরণ যেখানে আমরা একটি ফাইল খুলি এবং ডেটাতে কিছু কাজ করার জন্য এটি পড়ি।
সিঙ্ক্রোনাস ওয়ে:
Open File
Repeat This:
Read Some
Do the work
অ্যাসিনক্রোনাস ওয়ে:
Open File and Do this when it is ready: // Our function returns
Repeat this:
Read Some and when it is ready: // Returns again
Do some work
আপনি দেখতে পাচ্ছেন যে, আমাদের ফাংশনটি সিস্টেমকে একটি ফাইল খোলার অনুরোধ করে এবং এটি খোলার জন্য অপেক্ষা করে না। ফাইল প্রস্তুত হওয়ার পরে পরবর্তী পদক্ষেপ সরবরাহ করে এটি নিজেকে শেষ করে। আমরা যখন ফিরে আসি, নোড কাতারে অন্য ফাংশন কল চালায়। সমস্ত ক্রিয়াকলাপ চালিয়ে যাওয়ার পরে, ইভেন্ট লুপটি পরবর্তী বারে চলে যায় ...
সংক্ষেপে, নোডের মাল্টি-থ্রেড বিকাশের তুলনায় সম্পূর্ণ আলাদা দৃষ্টান্ত রয়েছে; তবে এর অর্থ এই নয় যে এতে জিনিসগুলির অভাব রয়েছে। একটি সিঙ্ক্রোনাস কাজের জন্য (যেখানে আমরা প্রক্রিয়াকরণের ক্রম এবং পদ্ধতিটি নির্ধারণ করতে পারি), এটি বহু-থ্রেডযুক্ত সমান্তরালতার পাশাপাশি কাজ করে। বাইরে থেকে আসে এমন কোনও কাজের জন্য যেমন কোনও সার্ভারের অনুরোধ, এটি কেবল উচ্চতর।
(1) আপনি যদি অন্য ভাষাতে সি / সি +++ এর মতো লাইব্রেরি তৈরি না করেন তবে আপনি যদি এখনও বিভাজনের জন্য থ্রেড তৈরি করেন না। এই ধরণের কাজের জন্য আপনার দুটি থ্রেড রয়েছে যার একটি নোডের সাথে যোগাযোগ চালিয়ে যাবে এবং অন্যটি আসল কাজ করে।
(২) প্রকৃতপক্ষে, প্রতিটি নোড প্রক্রিয়াটিতে একই কারণে একাধিক থ্রেড রয়েছে যা আমি প্রথম পাদটিকায় উল্লেখ করেছি। তবে এটি 1000 টি থ্রেডের অনুরূপ কাজগুলি করার মতো কোনও উপায় নয়। এই অতিরিক্ত থ্রেডগুলি আইও ইভেন্টগুলি গ্রহণ করতে এবং আন্ত-প্রক্রিয়া বার্তাপ্রেরণ পরিচালনা করার মতো জিনিসের জন্য।
আপডেট (মন্তব্যে একটি ভাল প্রশ্নের উত্তর হিসাবে)
@ মার্ক, গঠনমূলক সমালোচনার জন্য আপনাকে ধন্যবাদ। নোডের দৃষ্টান্তে, আপনার ক্রিয়ায় থাকা সমস্ত কলগুলি একের পর এক চালানোর জন্য নকশাকৃত না হলে ফাংশনগুলি কখনই প্রসেস করতে খুব বেশি সময় নেয় না। গণনামূলকভাবে ব্যয়বহুল কাজগুলির ক্ষেত্রে, আমরা যদি চিত্রটি সম্পূর্ণভাবে দেখি, আমরা দেখতে পাই যে এটি "আমাদের থ্রেড বা প্রক্রিয়াগুলি ব্যবহার করা উচিত?" এর প্রশ্ন নয়? তবে একটি প্রশ্ন "কীভাবে আমরা এই কাজগুলিকে একটি সুষম সুষম পদ্ধতিতে উপ-কার্যগুলিতে ভাগ করতে পারি যা আমরা সিস্টেমে একাধিক সিপিইউ কোরকে সমান্তরালভাবে নিয়োগের ক্ষেত্রে চালাতে পারি?" ধরা যাক আমরা 8 টি কোর সহ একটি সিস্টেমে 400 টি ভিডিও ফাইল প্রক্রিয়া করব। যদি আমরা একবারে একটি ফাইল প্রক্রিয়া করতে চাই, তবে আমাদের এমন একটি সিস্টেমের প্রয়োজন যা একই ফাইলের বিভিন্ন অংশে প্রক্রিয়া করবে, সম্ভবত, একটি বহু-থ্রেডযুক্ত একক-প্রক্রিয়া সিস্টেম তৈরি করা আরও সহজ এবং আরও কার্যকর হবে। রাষ্ট্র ভাগ করে নেওয়ার / যোগাযোগের প্রয়োজন হলে আমরা একাধিক প্রক্রিয়া চালিয়ে এবং তাদের মধ্যে বার্তা প্রেরণের মাধ্যমে নোডটি এখনও ব্যবহার করতে পারি। যেমনটি আমি আগেই বলেছি, নোডের সাথে একাধিক প্রক্রিয়া পদ্ধতিপাশাপাশি এই ধরণের কাজে বহু-থ্রেডযুক্ত পদ্ধতি; তবে এর চেয়ে বেশি নয়। আবার, যেমনটি আমি আগেই বলেছি, নোড যে পরিস্থিতিটি জ্বলজ্বল করে তা যখন আমাদের একাধিক উত্স থেকে সিস্টেমে ইনপুট হিসাবে এই কাজগুলি আসে কারণ একযোগে অনেক সংযোগ রাখা হয় থ্রেড-প্রতি-সংযোগ বা প্রক্রিয়া-প্রতি সংযোগের তুলনায় নোডে আরও হালকা হয় পদ্ধতি.
setTimeout(...,0)
কল হিসাবে ; কখনও কখনও কাতারে কল করার জন্য প্রসেসিংয়ের অংশটি ভাগ করার জন্য সময় সাশ্রয়ী কাজের সময় বিরতি দেওয়া হয়। বিভিন্ন উপায়ে কাজগুলি ভাগ করা আপনাকে এগুলি থেকে বাঁচাতে পারে; কিন্তু তবুও, এটি সত্যই কোনও হ্যাক নয়, এটি কেবল ইভেন্টের সারিতে কাজ করার উপায়। এছাড়াও, process.nextTick
এই লক্ষ্যের জন্য ব্যবহার করা আরও ভাল কারণ আপনি যখন ব্যবহার করবেন setTimeout
তখন সময় গণনা এবং সময় যাচাই করা প্রয়োজন হবে যখন process.nextTick
আমরা সত্যই চাই: "আরে টাস্ক, সারির শেষে ফিরে যাও, আপনি আপনার ভাগ ব্যবহার করেছেন! "