কর্টিন এবং থ্রেডের মধ্যে পার্থক্য কী? একে অপরকে ব্যবহার করার কোনও সুবিধা আছে কি?
কর্টিন এবং থ্রেডের মধ্যে পার্থক্য কী? একে অপরকে ব্যবহার করার কোনও সুবিধা আছে কি?
উত্তর:
কার্টাইনগুলি প্রথম নজরে থ্রেডের মতো কাজ করছে বলে মনে হচ্ছে, তারা আসলে কোনও মাল্টিথ্রেডিং ব্যবহার করছে না। তারা ক্রমান্বয়ে মৃত্যুদন্ড কার্যকর করা হয় যতক্ষণ না তারা yield
। ইঞ্জিনটি তার নিজস্ব প্রধান লুপের অংশ হিসাবে সমস্ত উত্পাদিত করোটিনগুলি পরীক্ষা করবে (ঠিক কী ধরণের ধরণের উপর নির্ভর করে yield
, আরও তথ্যের জন্য এই চিত্রটি পরীক্ষা করে দেখুন ), পরের আগ পর্যন্ত এগুলি একের পর এক চালিয়ে yield
যান এবং তারপরে মূল লুপটি নিয়ে এগিয়ে যান।
এই কৌশলটির সুবিধা রয়েছে যে আপনি আসল মাল্টিথ্রেডিংয়ের সমস্যাজনিত কারণে মাথাব্যথা ছাড়াই কর্টিন ব্যবহার করতে পারেন। আপনি প্রসঙ্গের সুইচগুলির কারণে কোনও অচলাবস্থা, বর্ণের পরিস্থিতি বা পারফরম্যান্স সমস্যা পাবেন না, আপনি সঠিকভাবে ডিবাগ করতে সক্ষম হবেন এবং আপনার থ্রেড-নিরাপদ ডেটা পাত্রে ব্যবহার করার প্রয়োজন নেই। এটি কারণ যখন কোনও কর্টিন কার্যকর করা হয় তখন ইউনিটির ইঞ্জিনটি নিয়ন্ত্রিত অবস্থায় থাকে। সর্বাধিক ityক্য কার্যকারিতা ব্যবহার করা নিরাপদ।
অন্যদিকে থ্রেড সহ, ityক্যটির মূল লুপটি এই মুহুর্তে কী অবস্থায় রয়েছে সে সম্পর্কে আপনার একেবারেই কোনও জ্ঞান নেই (এটি আসলে আর চলতে পারে না)। সুতরাং আপনার থ্রেডের ফলে এমন কিছু করা উচিত নয় এমন সময়ে কিছু করার দ্বারা যথেষ্ট বিপর্যয় ঘটতে পারে। উপ-থ্রেড থেকে কোনও স্থানীয় nativeক্য কার্যকারিতা স্পর্শ করবেন না । আপনার যদি একটি সাব-থ্রেড এবং আপনার মূল থ্রেডের মধ্যে যোগাযোগের প্রয়োজন হয় তবে থ্রেডটি কিছু থ্রেড-সেফ (!) ধারক-বস্তুতে লিখুন এবং একটি ইউনিট ইভেন্ট ফাংশন চলাকালীন একটি মনোবিহাইওর সেই তথ্যটি পড়ুন।
"রিয়েল" মাল্টিথ্রেডিং না করার অসুবিধাটি হ'ল আপনি একাধিক সিপিইউ কোরের উপর সিপিইউ-নিবিড় গণনাগুলিকে সমান্তরালভাবে কর্টিনগুলি ব্যবহার করতে পারবেন না। আপনি এগুলি একাধিক আপডেটের মাধ্যমে গণনা বিভক্ত করতে ব্যবহার করতে পারেন। সুতরাং আপনার গেমটি এক সেকেন্ডের জন্য হিমায়িত করার পরিবর্তে, আপনি একাধিক সেকেন্ডের চেয়ে কম গড় ফ্রেমরেট পান। তবে yield
সেক্ষেত্রে আপনি যখনই ইউনিটিটিকে কোনও আপডেট চালানোর অনুমতি দিতে চান তখন আপনি আপনার কর্টিনের জন্য দায়বদ্ধ ।
উপসংহার:
কম্পিউটার বিজ্ঞানে আমরা কাউরেটিনগুলি "সমবায় মাল্টিটাস্কিং" বলি ines এগুলি কার্যকরভাবে একাধিক বিভিন্ন স্ট্রিমের সহযোগিতামূলকভাবে প্রত্যেকের সাথে ইন্টারলিভ করার একটি উপায়। সমবায় মাল্টিটাস্কিংয়ে মৃত্যুদন্ড কার্যকর করার এক স্ট্রিমের সিপিইউয়ের একমাত্র বিতর্কিত মালিকানা এটি না পৌঁছানো পর্যন্ত yield
। এই মুহুর্তে, ইউনিটি (বা আপনি যে কোনও ফ্রেমওয়ার্ক ব্যবহার করছেন) এর কার্যকর করার একটি পৃথক প্রবাহে স্যুইচ করার বিকল্প রয়েছে। এরপরে এটি সিপিইউর একমাত্র অবিসংবাদিত মালিকানা পায় যতক্ষণ না এটি হয় yield
।
থ্রেডগুলি যাকে আমরা "প্রিপ্রিমটিভ মাল্টিটাস্কিং" বলি। আপনি যখন থ্রেড ব্যবহার করছেন, ফ্রেমওয়ার্কটি আপনার থ্রেডটিকে মাঝের চিন্তাধারাকে থামাতে এবং অন্য থ্রেডে স্যুইচ করার জন্য যে কোনও সময়ে সঠিক সংরক্ষণ করে । আপনি কোথায় আছেন তাতে কিছু আসে যায় না। এমনকি কিছু ক্ষেত্রে মেমরিতে ভেরিয়েবল লেখার মাধ্যমে আপনাকে কিছুটা অংশ বন্ধ করা যেতে পারে!
প্রত্যেকের জন্য বিভিন্ন মতামত রয়েছে। কর্টাইনগুলির কনসটি সম্ভবত বোঝার জন্য সবচেয়ে সহজ। প্রথমে, Coroutines সমস্ত একটি একক কোর উপর চালিত। আপনার যদি কোয়াড কোর সিপিইউ থাকে, তবে কর্টাইনগুলি কেবলমাত্র চারটি কররের একটি ব্যবহার করবে। এটি জিনিসগুলি সহজতর করে তবে কিছু ক্ষেত্রে এটি পারফরম্যান্সের সমস্যা হতে পারে। দ্বিতীয় কনটি হ'ল আপনাকে অবশ্যই সচেতন থাকতে হবে যে কোনও কর্টিন আপনার সম্পূর্ণ প্রোগ্রামটিকে কেবল অস্বীকার করে থামিয়ে দিতে পারে yield
। এটি বহু বছর আগে ম্যাক ওএস 9-এ একটি সমস্যা ছিল। ওএস 9 সম্পূর্ণ কম্পিউটারে কেবল সমবায় মাল্টিটাস্কিংকে সমর্থন করে। যদি আপনার কোনও প্রোগ্রাম হ্যাং করে থাকে তবে এটি কম্পিউটারকে এত মারাত্মকভাবে থামিয়ে দিতে পারে যে ওএস আপনাকে ত্রুটি বার্তার পাঠ্যও রেন্ডার করতে পারেনি যা আপনাকে জানায়!
কর্টাইনগুলির সুবিধা হ'ল এগুলি বুঝতে অপেক্ষাকৃত সহজ। আপনার ত্রুটিগুলি আরও বেশি অনুমানযোগ্য। তারা সাধারণত কম সংস্থানগুলির জন্যও আহ্বান জানায়, যা আপনি হাজার হাজার কর্টিন বা থ্রেডের দশকে উঠতে সাহায্য করতে পারেন। ক্রেডিট মুন মন্তব্যগুলিতে উল্লেখ করেছেন যে, আপনি যদি থ্রেডগুলি যথাযথভাবে অধ্যয়ন না করেন তবে কেবল করটিইনে আটকে থাকুন এবং সেগুলি সঠিক right কার্টাইনগুলি কাজ করার জন্য অনেক সহজ।
থ্রেডগুলি সম্পূর্ণ আলাদা একটি জন্তু be অন্য থ্রেড যে কোনও সময় আপনাকে বিঘ্নিত করতে পারে এই সম্ভাবনা থেকে আপনাকে সর্বদা সতর্ক থাকতে হবেএবং আপনার ডেটা নিয়ে গোলমাল করুন। থ্রেডিং লাইব্রেরিগুলি আপনাকে এটিকে সহায়তা করার জন্য শক্তিশালী সরঞ্জামগুলির পুরো স্যুট সরবরাহ করে, যেমন মুটেক্সেস এবং কন্ডিশনের ভেরিয়েবলগুলি যখন আপনার অন্য থ্রেডগুলির মধ্যে একটি চালানো নিরাপদ এবং যখন এটি অনিরাপদ থাকে তখন আপনাকে ওএসকে বলতে সহায়তা করে। এই সরঞ্জামগুলি কীভাবে ভালভাবে ব্যবহার করতে হয় তার জন্য নিখুঁত কোর্স রয়েছে। উত্থাপিত বিখ্যাত সমস্যাগুলির মধ্যে একটি হ'ল "অচলাবস্থা", যখন তখন দুটি থ্রেড দু'জনেই "আটকে" যায় অন্যটির জন্য কিছু সংস্থান মুক্ত করার অপেক্ষায়। আর একটি সমস্যা, যা ইউনিটির পক্ষে অত্যন্ত গুরুত্বপূর্ণ, তা হ'ল অনেক লাইব্রেরি (ইউনিটির মতো) একাধিক থ্রেড থেকে কল সমর্থন করার জন্য ডিজাইন করা হয়নি। কোন কলগুলি অনুমোদিত এবং কোনটি নিষিদ্ধ তা যদি আপনি মনোযোগ না দেন তবে আপনি খুব সহজেই আপনার কাঠামোটি ভেঙে ফেলতে পারেন।
এই অতিরিক্ত জটিলতার কারণটি আসলে খুব সহজ। প্রিম্পিটিভ মাল্টিটাস্কিং মডেলটি মাল্টিথ্রেডিং মডেলের সাথে সত্যই অনুরূপ যা আপনাকে কেবল অন্য থ্রেডকে বাধাগ্রস্থ করতে নয়, প্রকৃতপক্ষে বিভিন্ন কোরগুলিতে পাশাপাশি থ্রেডগুলি চালানোর অনুমতি দেয়। এটি অবিশ্বাস্যরূপে শক্তিশালী, এই নতুন কোয়াড কোর এবং হেক্স কোড সিপিইউগুলি যা সত্যিই বেরিয়ে আসার একমাত্র উপায়, তবে প্যানডোরাস বাক্সটি খোলে। মাল্টিথ্রেডিং বিশ্বে এই ডেটা কীভাবে পরিচালনা করতে হবে তার জন্য সিঙ্ক্রোনাইজেশন নিয়মগুলি ইতিবাচকভাবে নির্মম। সি ++ বিশ্বে, পুরো নিবন্ধগুলিতে উত্সর্গীকৃত MEMORY_ORDER_CONSUME
এটি মাল্টিথ্রেডিং সিঙ্ক্রোনাইজেশনের এক ইটি-বিটি-টেনি-ওয়েইনি কোণ dedicated
তাই থ্রেডিং এর কনস? সাধারণ: তারা শক্ত। আপনি এর আগে কখনও কখনও কখনও দেখা হয়নি এমন পুরো ক্লাসের বাগগুলিতে আসতে পারেন। অনেকগুলি তথাকথিত "হাইজেনব্যাগস" থাকে যা কখনও কখনও উপস্থিত হয় এবং আপনি সেগুলি ডিবাগ করলেই অদৃশ্য হয়ে যায়। এগুলি মোকাবেলায় আপনাকে দেওয়া সরঞ্জামগুলি খুব শক্তিশালী তবে সেগুলি খুব নিম্ন স্তরেরও। এগুলিকে সহজে ব্যবহারের জন্য নকশাকৃত না করে আধুনিক চিপের আর্কিটেকচারে দক্ষ হওয়ার জন্য ডিজাইন করা হয়েছে।
তবে, আপনি যদি আপনার সমস্ত সিপিইউ শক্তি ব্যবহার করতে চান তবে সেগুলি আপনার প্রয়োজনীয় সরঞ্জাম। এছাড়াও, হয় আসলে আলগোরিদিম যা multithreading চেয়ে তারা coroutines সঙ্গে আছে বুঝতে কেবল কারণ আপনার অপারেটিং সিস্টেম হ্যান্ডেল সব যেখানে বাধা ঘটতে পারে প্রশ্নে দিন সহজ।
কর্টিনগুলিতে লেগে থাকার জন্য ক্যান্ডিড মুনের মন্তব্যটিও আমার সুপারিশ। আপনি যদি থ্রেডের শক্তি চান, তবে এটির প্রতিশ্রুতি দিন। বাইরে যান এবং সত্যিই আনুষ্ঠানিকভাবে থ্রেড শিখুন। থ্রেডগুলি সম্পর্কে কীভাবে ভাবা যায় তার সর্বোত্তম উপায়টি কীভাবে সংগঠিত করা যায় তা নির্ধারণ করার জন্য আমাদের বেশ কয়েক দশক লেগেছিল যাতে আপনি নিরাপদ নির্ভরযোগ্য পুনরাবৃত্তিযোগ্য ফলাফলগুলি তাড়াতাড়ি পান এবং আপনি যেতে পারফরম্যান্স যুক্ত করুন। উদাহরণস্বরূপ, সমস্ত বুদ্ধিমান কোর্সগুলি কন্ডিশন ভেরিয়েবলগুলি শেখানোর আগে মূটেক্সগুলি শেখাবে। পারমাণবিক বিষয়গুলি কভার করে এমন সমস্ত বুদ্ধিমান কোর্সগুলি এমনকি পরমাণুর অস্তিত্বের উল্লেখ করার আগে সম্পূর্ণভাবে মিটেক্স এবং শর্তের পরিবর্তনগুলি শিখিয়ে দেবে। (দ্রষ্টব্য: অণুবিদ্যার উপর বুদ্ধিমান টিউটোরিয়াল বলে কোনও জিনিস নেই)) টুকরোচাল থ্রেডিং শিখার চেষ্টা করুন এবং আপনি মাইগ্রেনের জন্য ভিক্ষা করছেন।
join()
নয়, তবে আপনার কিছু প্রয়োজন। আপনার কাছে সিঙ্ক্রোনাইজেশন করার জন্য এমন কোনও ডিজাইন তৈরি করেছেন এমন কোনও স্থপতি যদি আপনার কাছে না থাকেন তবে আপনাকে নিজে এটি লিখতে হবে। মাল্টিথ্রেডেড স্টাফ করে এমন কেউ হিসাবে, আমি দেখতে পেলাম যে কম্পিউটারগুলি কীভাবে কাজ করে তার মানসিক মডেলগুলি নিরাপদে সিঙ্ক্রোনাইজেশন করার আগে সামঞ্জস্য করা প্রয়োজন (যা ভাল কোর্সগুলি শিখিয়ে দেবে)
join
। আমার বক্তব্যটি হ'ল থ্রেডিংয়ের সম্ভাব্য পারফরম্যান্স বেনিফিটগুলির একটি মাঝারি অংশটিকে অনুসরণ করা, কখনও কখনও কোনও বড় ভগ্নাংশ কাটার জন্য আরও জটিল থ্রেডিং পদ্ধতির ব্যবহারের চেয়ে ভাল হতে পারে।
সহজতম শর্তে ...
টপিক
কোনও থ্রেড যখন ফলন করে তা স্থির করে না, অপারেটিং সিস্টেম ('ওএস', উদাহরণস্বরূপ উইন্ডোজ) কোনও থ্রেড ফলনের সময় সিদ্ধান্ত নেয়। অপারেটিং সিস্টেমটি থ্রেডগুলি নির্ধারণের জন্য প্রায় সম্পূর্ণ দায়বদ্ধ, এটি সিদ্ধান্ত নিয়েছে যে কোন থ্রেডগুলি চালানো হবে, কখন সেগুলি চালানো হবে এবং কতক্ষণ চলবে।
অতিরিক্তভাবে একটি থ্রেড সমকালীনভাবে চালানো হতে পারে (একের পর এক থ্রেড) বা অ্যাসিনক্রোনাসলি (বিভিন্ন সিপিইউ কোরগুলিতে বিভিন্ন থ্রেড চলছে)। অবিচ্ছিন্নভাবে চালনার ক্ষমতা মানে থ্রেডগুলি একই পরিমাণে আরও বেশি কাজ করতে পারে (কারণ থ্রেডগুলি আক্ষরিক অর্থে একই সময়ে দুটি কাজ করছে)। এমনকি সিঙ্ক্রোনাস থ্রেডগুলি ওএসের সময় নির্ধারণের ক্ষেত্রে ভাল হলে প্রচুর কাজ সম্পন্ন করে।
তবে এই অতিরিক্ত প্রসেসিং শক্তিটি পার্শ্ব প্রতিক্রিয়া সহ আসে। উদাহরণস্বরূপ, যদি দুটি থ্রেড একই সংস্থানটি অ্যাক্সেস করার চেষ্টা করে (উদাহরণস্বরূপ একটি তালিকা) এবং প্রতিটি থ্রেড এলোমেলোভাবে কোডের যে কোনও বিন্দুতে থামানো যেতে পারে, তবে দ্বিতীয় থ্রেডের পরিবর্তনগুলি প্রথম থ্রেডের পরিবর্তনগুলিতে হস্তক্ষেপ করতে পারে। (আরও দেখুন: রেসের শর্ত এবং অচলাবস্থা ))
থ্রেডগুলি 'ভারী' হিসাবেও বিবেচিত হয় কারণ তাদের প্রচুর ওভারহেড থাকে যার অর্থ থ্রেডগুলি স্যুইচ করার সময় যথেষ্ট সময় পেনাল্টি হয়।
Coroutines
থ্রেডের বিপরীতে, কর্টাইনগুলি সম্পূর্ণ সিঙ্ক্রোনাস হয়, যে কোনও সময়ে কেবলমাত্র একটি কর্টিন চলতে পারে। অতিরিক্তভাবে কর্টাইনগুলি কখন ফলন করতে হয় তা চয়ন করতে পারে এবং এইভাবে কোডের একটি বিন্দুতে ফলন করতে পারে যা দৃin়প্রতিজ্ঞ (যেমন লুপ চক্রের শেষে)। এটি জাতির পরিস্থিতি এবং ডেডলকগুলির মতো সমস্যাগুলি এড়াতে অনেক সহজ, পাশাপাশি কর্টাইনগুলিকে একে অপরের সাথে সহযোগিতা করা সহজ করার মতো বিষয়গুলির সুবিধা রয়েছে।
তবে এটিও একটি বড় দায়বদ্ধতা, যদি কোনও কর্টিন সঠিকভাবে ফলন না করে তবে এটি প্রচুর প্রসেসরের সময় ব্যয় করতে পারে এবং যদি এটি ভাগ করে নেওয়া সংস্থানগুলি ভুলভাবে সংশোধন করে তবে এটি বাগগুলি সৃষ্টি করতে পারে।
কার্টাইনগুলি সাধারণত কোনও প্রসঙ্গের স্যুইচিংয়ের প্রয়োজন হয় না এবং এইভাবে সাইন ইন এবং আউটটি দ্রুত হয় এবং বেশ লাইটওয়েট হয়।
সংক্ষেপে:
থ্রেড:
Coroutine:
থ্রেড এবং কর্টিনগুলির ভূমিকাগুলি একইরকম, তবে তারা কীভাবে কাজটি সম্পাদন করে তার মধ্যে পার্থক্য রয়েছে যার অর্থ প্রতিটি পৃথক কাজের জন্য আরও উপযুক্ত suited থ্রেডগুলি সেই কাজের জন্য সর্বোত্তম যেখানে তারা বাধা না দিয়ে নিজেরাই কিছু করাতে মনোনিবেশ করতে পারে, তারপরে সংকেত ফিরে আসার পরে। অনেকগুলি ছোট ছোট পদক্ষেপ এবং কার্যক্রমে যেগুলি সহযোগিতামূলকভাবে ডেটা প্রসেসিংয়ের প্রয়োজন হয় তার জন্য কর্টিনগুলি সেরা tasks