কেন নোড.জেএস একক থ্রেডযুক্ত? [বন্ধ]


255

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

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

দ্রষ্টব্য: আমি এটি পেতে ক্লাস্টারিং ব্যবহার করেছি, তবে এটি সুন্দর নয়।


12
আমি সম্প্রতি একটি ভাল ভিডিও দেখেছি (29 মিনিট) নোডের পিছনে কিছু তত্ত্ব ব্যাখ্যা করে। এমনকি আমি মনে করি লোকটি সিপিইউ নিবিড় কাজ সম্পর্কে এবং সংক্ষেপে কীভাবে সেগুলি পরিচালনা করবেন সে সম্পর্কে কথা বলেছেন: youtube.com/watch?v=L0pjVcIsU6A
ঘূর্ণি

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

5
পিএইচপি জাভাস্ক্রিপ্টের চেয়ে আরও একক থ্রেডযুক্ত। আপনি সম্ভবত ফাস্টসিজিআই বা Mod_php এর মতো সার্ভার মডিউলগুলির কথা ভাবছেন। সুতরাং আপনি প্রকৃতপক্ষে নোড.জেএসকে আপাচি, এনগিনেক্স বা আইআইএস-এর সাথে তুলনা করছেন - পিএইচপি, জাভা বা রুবির সাথে নয়।
vlvaro González

34
নোড একক থ্রেডযুক্ত নয়। এটি একটি জনপ্রিয় ভুল ধারণা। এমনকি সহজ আমার সিস্টেমে পাঁচটি থ্রেডnode -e 'setTimeout(()=>{},1000);' & ps -T h $! | wc -l; kill $! প্রদর্শন করে। প্রধান ইভেন্টের লুপটি একক থ্রেডেড (এটি না থাকলে এটি বেশি বোঝা যায় না) তবে নোড ভারীভাবে বহু-থ্রেডযুক্ত এবং আপনি যদি চান তবে আপনি মাল্টি-থ্রেডড সিঙ্গল-প্রসেস অ্যাপ্লিকেশন লিখতে পারেন। আমি এটি সম্পর্কে একটি বিস্তৃত উত্তর লিখতে চাই তবে কিছু লোক আপনার প্রশ্নটি বন্ধ করার সিদ্ধান্ত নিয়েছে তাই আমি পারব না। আমি এটি আবার খুলতে ভোট দিচ্ছি। যদি এটি আরও বেশি ভোট পেয়ে পুনরায় খোলা যায় তবে দয়া করে মন্তব্যে আমাকে উল্লেখ করুন।
আরএসপি

2
@ আরএসপি আপনার মন্তব্যের জন্য ধন্যবাদ, তবে আমি মূল থ্রেডে বলতে চাইছি সম্পর্কিত নয়। আপনি যদি সিপিইউ সম্পর্কিত কোনও লুপের মতো বড় কিছু করে যা কিছু করে তবে সার্ভার প্রক্রিয়া সংযোগগুলি বন্ধ করে দেয়। অর্থ, সার্ভারের সময় অকার্যকর। সুতরাং আমরা ক্লাস্টারের মতো হ্যাকগুলি ব্যবহার না করে কেবল এত সহজ কিছু করার পরিবর্তে সহজাতভাবে বেশিরভাগ সার্ভারের মতো প্রতিটি সংযোগ থ্রেড করে রেখেছি। jxcore.com এটিকে সম্বোধন করার চেষ্টা করেছিল কিন্তু তারপরে এটি একটি বিশেষ / সংশোধিত নোড প্লাগইন তৈরি করে যা মূলত এটি আমার পক্ষে অব্যর্থ makes
foreyez

উত্তর:


292

নোড.জেস স্পষ্টভাবে অ্যাসিঙ্ক প্রসেসিংয়ে একটি পরীক্ষা হিসাবে তৈরি করা হয়েছিল। তত্ত্বটি হ'ল একক থ্রেডে অ্যাসিঙ্ক প্রসেসিং করা সাধারণ থ্রেড-ভিত্তিক প্রয়োগের চেয়ে সাধারণ ওয়েব লোডের অধীনে আরও কর্মক্ষমতা এবং স্কেলিবিলিটি সরবরাহ করতে পারে।

এবং আপনি জানেন কি? আমার মতে এই তত্ত্বটি বহন করা হয়েছে। একটি নোড.জেএস অ্যাপ্লিকেশন যা সিপিইউ নিবিড় স্টাফ করছে না তা অ্যাপাচি বা আইআইএস বা অন্যান্য থ্রেড-ভিত্তিক সার্ভারের চেয়ে হাজার হাজার আরও একত্রে সংযোগ চালাতে পারে।

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

শেষ পর্যন্ত, আমি মনে করি না এটি সর্বজনীনতর ভাল বা আরও খারাপ; এটি ভিন্ন, এবং কখনও কখনও এটি ভাল এবং কখনও কখনও এটি হয় না। কাজের জন্য সঠিক টুল ব্যবহার করুন।


26
তবে ওয়েব সার্ভারগুলি সাধারণত প্রচুর সিপিইউ নিবিড় স্টাফ করে থাকে এটি কেবল ডেটাবেস আনছে না। আমাদের কী সংগ্রহ করা যায় তা প্রক্রিয়া করা দরকার এবং ক্লায়েন্টের কাছে এটি সরবরাহ করার আগে প্রচুর ব্যবসায়িক যুক্তি যুক্ত করা উচিত।
foreyez

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

7
তার সাথে সমস্যাটি হ'ল কর্মী প্রতি ওএস স্তরের প্রক্রিয়া চলছে .. আপনি তাদের "পিএস" কমান্ডটি ব্যবহার করতে দেখবেন। সুতরাং সম্ভবত এটির অর্থ মেশিনে একবারে কয়েক হাজার প্রক্রিয়া চলছে - এটি বাদাম!
foreyez

9
@ ফরেয়েজ, আপনার ব্যবহারকারীর জন্য কোনও প্রক্রিয়া দরকার নেই। আপনি কীভাবে বোঝা ভাগ করবেন তাতে আপনার পছন্দ রয়েছে। এছাড়াও, সকলেই এক টন সিপিইউ নিবিড় স্টাফ করছে না। নোড একটি কাজের একটি সরঞ্জাম ... সম্ভবত আপনার কাজ নয়, তবে বিভিন্ন ধরণের কাজ।
ব্র্যাড

15
প্রকৃতপক্ষে, আমি @ ফরেজিজকে এই বিবৃতিটি ব্যাক আপ করতে চাই যে "ওয়েব সার্ভারগুলি সাধারণত সিপিইউ নিবিড় স্টাফের ALOT (sic) এর কাছে থাকে"। আমার অভিজ্ঞতা, তারা না। অথবা 'সিপিইউ নিবিড়' সম্পর্কে আমার সংজ্ঞা তার থেকে আলাদা fers পণ্য ডেটাটিকে ইউআইতে রূপান্তর করা সিপিইউ নিবিড় নয়, অর্ডার বা এর মতো গণনাও করে না। বেশিরভাগ ওয়েব বেশ লেনদেনের। সিপিইউ নিবিড় স্টাফ হ'ল ভিডিও রূপান্তরকরণ, চিত্রের ফর্ম্যাট রূপান্তরকরণ ইত্যাদির মতো জিনিস etc. অনেকগুলি ফাইল আই / ও এর কারণে যা আসলে নোডটি বেশ ভাল করে। এবং রূপান্তরকে উত্সর্গীকৃত অন্য প্রক্রিয়াতে অফলোড করা সহজ করে তোলে।
পল

62

কোনও সার্ভারের জন্য "অনুরোধের জন্য এক থ্রেড" মডেলের সমস্যাটি হ'ল ইভেন্ট লুপ থ্রেড মডেলের তুলনায় বেশ কয়েকটি পরিস্থিতিতে তারা ভাল স্কেল করে না।

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

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

বাস্তব বিশ্বে বেশিরভাগ পরিস্থিতি মাঝখানে কিছুটা হবে। সঠিক আর্কিটেকচারটি খুঁজে পেতে আপনার বিকাশের জটিলতার সাথে স্কেলাবিলিটির আসল প্রয়োজনের ভারসাম্য বজায় রাখতে হবে (যেমন সিপিইউ নিবিড় কাজগুলির জন্য ব্যাক-এন্ডে প্রেরণ করা একটি ইভেন্ট বেস ফ্রন্ট-এন্ড রয়েছে The সামনের প্রান্তটি টাস্কের অপেক্ষায় সামান্য সংস্থান ব্যবহার করবে) ফলাফল।) যে কোনও বিতরণ ব্যবস্থার মতো এটির কাজ করার জন্য কিছু প্রচেষ্টা প্রয়োজন।

আপনি যদি সিলভার বুলেটটি সন্ধান করছেন যা কোনও প্রকার প্রচেষ্টা ছাড়াই যে কোনও দৃশ্যের সাথে খাপ খায়, আপনার পায়ে বুলেটটি শেষ হবে।


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

2
@Kazaag, আধুনিক ওয়েব সার্ভার না একটি threadpool বজায় রাখা। তারা কেবল পৃষ্ঠায় লোডের জন্য বিনীতভাবে নতুন থ্রেড ছড়িয়ে দেয় না। সেগুলি হ'ল পুরানো ওয়েব সার্ভারগুলি।
পেসারিয়ার

1
@ পেসারিয়ার আমি কখনই বলিনি যে একটি নতুন থ্রেড স্প্যান করা হবে, তবে অনুরোধটি শেষ না হওয়া পর্যন্ত প্রতিটি থ্রেড একটি অনুরোধে বরাদ্দ করা হয়।
কাজাগ

2
@ কাজাগ অবশ্যই এটি সাধারণ নিয়ম নয় যে "অনুরোধ শেষ না হওয়া পর্যন্ত প্রতিটি থ্রেডকে একটি অনুরোধে বরাদ্দ করা হয়"। অর্থ্যাৎ নেট (HTTP অনুরোধগুলি প্রক্রিয়াকরণ সহ) এসিঙ্ক (টাস্ক ভিত্তিক) প্রোগ্রামিং ব্যবহার করতে পারে এবং এটি আই / ও এবং অন্যান্য এসিঙ্ক অপারেশনগুলি সম্পন্ন হওয়ার অপেক্ষায় থ্রেড প্রকাশ করবে। এটি উচ্চ স্তরের প্রোগ্রামিং, যেমন এমভিসি / এপিআই নিয়ন্ত্রণকারীদের ক্ষেত্রেও প্রযোজ্য। সুতরাং অনুশীলনে 20 টি HTTP অনুরোধগুলি মুলতুবি থাকতে পারে তবে কেবলমাত্র একটি সক্রিয় থ্রেড।
ব্যবহারকারী 3285954

29

দীর্ঘ গল্প সংক্ষিপ্ত, ভি 8 থেকে নোড আঁকুন, যা অভ্যন্তরীণভাবে একক থ্রেডযুক্ত। সিপিইউ-নিবিড় কাজের জন্য সীমাবদ্ধতার আশপাশে কাজ করার উপায় রয়েছে।

এক পর্যায়ে (0.7) লেখকগণ গণনার একাধিক থ্রেড প্রয়োগের উপায় হিসাবে বিচ্ছিন্নতার পরিচয় দেওয়ার চেষ্টা করেছিলেন, তবে শেষ পর্যন্ত তা সরানো হয়েছিল: https://groups.google.com/forum/#!msg/nodejs/zLzuo292hX0/F7gqfUiKi2sJ


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