বিখ্যাত

কনকুরেন্সি বনাম ইভেন্ট লুপ বনাম ইভেন্ট লুপ + কনকুরન્સી

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

সমকালীন প্রোগ্রামিং

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

এই চিত্রটি সামঞ্জস্যের মৌলিক মডেলটি প্রদর্শন করছে, তবে কর্সের এটি এত সহজ নয় যে এটি প্রদর্শিত হয় :)

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

// গো ভাষার সাথে ভুল সমঝোতা
প্যাকেজ প্রধান
আমদানি (
   "FMT"
   "সময়"
)
var SharedMap = Make (মানচিত্র [স্ট্রিং] স্ট্রিং)
ফানক চেঞ্জম্যাপ (মান স্ট্রিং) {
    SharedMap ["পরীক্ষা"] = মান
}
মজাদার প্রধান () {
    যান পরিবর্তনম্যাপ ("মান 1")
    যান পরিবর্তনম্যাপ ("মান 2")
    সময়.স্লিপ (সময়.মিলিসেকেন্ড * 500)
    fmt.Println (SharedMap [ "পরীক্ষা"])
}
// এটি "মান 1" বা "মান 2" মুদ্রণ করবে আমরা ঠিক জানি না!

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

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

বেশিরভাগ বিকাশকারী একযোগে প্রোগ্রামিং পছন্দ করেন না কারণ কনক্যুরেন্সির অর্থ সর্বদা পারফরম্যান্স। এটি নির্দিষ্ট ক্ষেত্রে নির্ভর করে।

একক থ্রেডেড ইভেন্ট লুপ

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

সাধারণ প্রবাহ অনুসরণ করা হচ্ছে
1. ইভেন্ট ইমিটার পরবর্তী লুপ চক্রের মধ্যে কার্যকর করতে ইভেন্ট সারিতে টাস্ক যুক্ত করে
২. ইভেন্ট লুপ ইভেন্ট কাতার থেকে কাজ পেয়েছে এবং হ্যান্ডলারের উপর ভিত্তি করে এটি প্রক্রিয়া করছে

নোড.জেএস দিয়ে একই উদাহরণ লিখতে দেয়

SharedMap = {};
কনস্ট চেঞ্জম্যাপ = (মান) =>
    রিটার্ন () => {
        SharedMap ["পরীক্ষা"] = মান
    }
}
// 0 টাইমআউট মানে আমরা পরবর্তী চক্রের জন্য কাতারে নতুন টাস্ক তৈরি করছি
সেটটাইমআউট (চেঞ্জম্যাপ ("মান 1")), 0);
সেটটাইমআউট (চেঞ্জম্যাপ ("মান 2"), 0);
setTimeout (() => {
   console.log (SharedMap [ "পরীক্ষা"])
}, 500);
// এই ক্ষেত্রে নোড.জেএস "মান 2" মুদ্রণ করবে কারণ এটি একক
// থ্রেডেড এবং এতে "শুধুমাত্র একটি টাস্কের সারি" রয়েছে

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

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

সংকেত + ইভেন্ট লুপ - থ্রেড সুরক্ষা সহ থ্রেড পুল

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

Nginx ওয়েব সার্ভার স্ট্রাকচার থেকে থ্রেড পুল + ইভেন্ট লুপ মডেলটি একবার দেখে নেওয়া যাক

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

সুতরাং এই কাঠামোটি ব্যবহার করে আপনি উভয় থ্রেড সুরক্ষা এবং সংকেত পেয়ে যা যা পারফরম্যান্সের জন্য সমস্ত সিপিইউ কোর ব্যবহার করে এবং একক থ্রেডেড ইভেন্ট লুপের সাথে নন-ব্লকিং নীতি রাখে।

উপসংহার

অনেকগুলি সফ্টওয়্যার খাঁটি সম্মিলনীর সাথে বা খাঁটি একক থ্রেডেড ইভেন্ট লুপের সাথে লিখিত হয় তবে একক প্রয়োগের ভিতরে উভয়কে একত্রিত করে পারফরম্যান্ট অ্যাপ্লিকেশন লিখতে এবং সমস্ত উপলব্ধ সিপিইউ সংস্থান ব্যবহার করে।