আরএক্সজাভা সিডিউলারের ক্ষেত্রে কেসগুলি ব্যবহার করুন


253

আরএক্স জাভাতে বেছে নেওয়ার জন্য 5 টি আলাদা শিডিয়ুলার রয়েছে :

  1. तत्काल () : বর্তমান থ্রেডে তাত্ক্ষণিক কাজ সম্পাদন করে এমন একটি শিডিয়ুলার তৈরি করে এবং ফেরত দেয় returns

  2. ট্রাম্পলাইন () : স্যুইডুলার তৈরি করে এবং রিটার্ন দেয় যা বর্তমান কাজ শেষ হওয়ার পরে সারিগুলি বর্তমান থ্রেডে কার্যকর করা হবে।

  3. newThread () : একটি সময়সূচী তৈরি করে এবং প্রদান করে যা কাজের প্রতিটি ইউনিটের জন্য একটি নতুন থ্রেড তৈরি করে।

  4. গণনা () : গণনামূলক কাজের উদ্দেশ্যে একটি সময়সূচী তৈরি করে এবং প্রদান করে। এটি ইভেন্ট-লুপস, প্রসেসিং কলব্যাকস এবং অন্যান্য গণনার কাজের জন্য ব্যবহার করা যেতে পারে। এই সময়সূচীতে আইও-বাউন্ড কাজটি করবেন না। সময়সূচী ব্যবহার করুন। io () পরিবর্তে।

  5. io () : আইও-বাউন্ড কাজের জন্য একটি সময়সূচী তৈরি করে এবং ফেরত দেয়। বাস্তবায়নের জন্য একটি নির্বাহী থ্রেড-পুল সমর্থন করে যা প্রয়োজন অনুযায়ী বাড়বে। এটি অযৌক্তিকভাবে IO ব্লক করার জন্য ব্যবহার করা যেতে পারে। এই সময়সূচীতে গণনামূলক কাজ করবেন না। সময়সূচী ব্যবহার করুন। পরিবর্তে গণনা ()

প্রশ্নাবলী:

প্রথম 3 টি শিডিয়ুলার বেশ স্ব ব্যাখ্যাযোগ্য; তবে, আমি গণনা এবং আইও সম্পর্কে কিছুটা বিভ্রান্ত ।

  1. "আইও-বাউন্ডড কাজ" আসলে কী? এটি স্ট্রিম ( java.io) এবং ফাইলগুলি ( java.nio.files) ব্যবহারের জন্য ব্যবহৃত হয় ? এটি কি ডাটাবেস প্রশ্নের জন্য ব্যবহার করা হয়? এটি ফাইল ডাউনলোড বা REST এপিআইগুলিতে অ্যাক্সেস করার জন্য ব্যবহৃত হয়?
  2. নিউট্রেড () এর থেকে গণনা কীভাবে আলাদা ? এটি কি সমস্ত গণনা () কলগুলি প্রতিবার নতুন (পটভূমি) থ্রেডের পরিবর্তে একক (পটভূমি) থ্রেডে রয়েছে?
  3. আইও কাজ করার সময় গণনা () কল করা খারাপ কেন ?
  4. গণনার কাজ করার সময় আইও () কল করা খারাপ কেন ?

উত্তর:


332

দুর্দান্ত প্রশ্ন, আমি মনে করি ডকুমেন্টেশন আরও কিছু বিশদ সহ করতে পারে।

  1. io()একটি আনবাউন্ডেড থ্রেড-পুল দ্বারা সমর্থন করা হয় এবং এটি অ-গণনামূলক নিবিড় কাজগুলির জন্য আপনি যে ধরণের জিনিস ব্যবহার করেন সেটি হ'ল সিপিইউতে খুব বেশি বোঝা চাপায় না এমন জিনিস। সুতরাং ফাইল সিস্টেমের সাথে হ্যাঁ ইন্টারঅ্যাকশন, অন্য কোনও হোস্টের ডাটাবেস বা পরিষেবাগুলির সাথে ইন্টারঅ্যাকশন ভাল উদাহরণ।
  2. computation()উপলব্ধ প্রসেসরের সংখ্যার সমান আকারযুক্ত একটি বাউন্ডেড থ্রেড-পুল দ্বারা ব্যাকড রয়েছে। যদি আপনি উপলব্ধ প্রসেসরের তুলনায় সমানতালে সিপিইউ নিবিড় কাজটি নির্ধারণ করার চেষ্টা করেন (ব্যবহার করুন বলুন newThread()) তবে আপনি থ্রেড তৈরি ওভারহেড এবং প্রসঙ্গটি প্রসেসরের জন্য থ্রেড হিসাবে ওভারহেড স্যুইচিংয়ের পক্ষে রয়েছেন এবং এটি সম্ভবত একটি বড় পারফরম্যান্স হিট।
  3. computation()সিপিইউ নিবিড় কাজের জন্য ছেড়ে যাওয়া ভাল তবে অন্যথায় আপনি ভাল সিপিইউ ব্যবহার করতে পারবেন না।
  4. io()২. এ আলোচিত কারণের জন্য কম্পিউটেশনাল কাজের আহ্বান জানানো খারাপ নয় io()এবং আপনি যদি io()সমান্তরালে এক হাজার গণনার কাজ নির্ধারণ করেন তবে সেই হাজার টাস্কগুলির প্রত্যেকটির নিজস্ব নিজস্ব থ্রেড থাকবে এবং সিপিইউ সহ প্রসঙ্গের স্যুইচিং ব্যয়ের জন্য প্রতিযোগিতা হবে।

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

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

4
ট্রাম্পোলিন () কার্যকর হবে যেখানে আপনি একটি উদাহরণ দেখাতে পারেন? আমি ধারণাটি বুঝতে পারি তবে বাস্তবে আমি এটি ব্যবহার করব এমন কোনও দৃশ্য আমি বুঝতে পারি না। এটিই একমাত্র
সময়সূচক

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

4
আপনি ভাবতে পারেন যে timeoutডিফল্টরূপে computation()আপনার গায়ে চাপানো থ্রেডকে ব্লক করে দিবে তবে এটি কেস নয়। কভার অধীনে computation()একটি ব্যবহার ScheduledExecutorServiceতাই সময় বিলম্বিত কর্মের ব্লক না। এই সত্যটি দেওয়া computation()একটি ভাল ধারণা কারণ এটি যদি অন্য থ্রেডে থাকে তবে আমরা থ্রেড স্যুইচিংয়ের ব্যয় সাপেক্ষে।
ডেভ মোটেন

3

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

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

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

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

একই যুক্তি ডাটাবেস অ্যাক্সেস বা দূরবর্তী এপিআই কলগুলির জন্য প্রযোজ্য। কল করতে আপনি যদি অ্যাসিক্রোনাস বা প্রতিক্রিয়াশীল API ব্যবহার করতে পারেন তবে শিডিয়ুলার.ইও ব্যবহার করবেন না ।

সম্মতিতে ফিরে যান। অবিচ্ছিন্নভাবে বা একযোগে I / O ক্রিয়াকলাপ করার জন্য আপনার কাছে কোনও অ্যাসিঙ্ক বা প্রতিক্রিয়াশীল API এ অ্যাক্সেস নাও থাকতে পারে, তাই আপনার একমাত্র বিকল্পটি আলাদা থ্রেডে একাধিক কল প্রেরণ করা to হায়রে, প্রতিক্রিয়াশীল স্ট্রিম তাদের প্রান্তে অনুক্রমিক হয় কিন্তু ভাল খবর হল যে হয় flatMap () অপারেটর তাদের অন্তঃস্থলে সম্পাতবিন্দু পরিচয় করিয়ে দিতে পারেন

সাধারণত ফ্ল্যাটম্যাপ () অপারেটরটি ব্যবহার করে স্ট্রিম কনস্ট্রাক্টে কনকুরঞ্জি অবশ্যই তৈরি করতে হবে । এই শক্তিশালী অপারেটরটি আপনার ফ্ল্যাটম্যাপ () এম্বেড করা ফাংশন <টি, আর> এর অভ্যন্তরীণভাবে একটি বহু-থ্রেড প্রসঙ্গ সরবরাহ করার জন্য কনফিগার করা যেতে পারে । সেই প্রসঙ্গটি মাল্টি-থ্রেড শিডিয়ুলার যেমন শিডিয়ুলেরিও বা শিডুলার ডটকমপুটেশন সরবরাহ করে

RxJava2 নিবন্ধ আরও বিবরণ খুঁজুন নির্ধারণ এবং concurrency যেখানে আপনি কোড নমুনা এবং কিভাবে ক্রমানুসারে এবং একই সময়ে নির্ধারণ ব্যবহার করার জন্য বিস্তারিত ব্যাখ্যা পাবেন।

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

Softjake


2

এই ব্লগ পোস্ট একটি দুর্দান্ত উত্তর সরবরাহ করে

ব্লগ পোস্ট থেকে:

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

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

সময়সূচী.নিউ থ্রেড () প্রতিটি তফসিল কাজের জন্য একটি নতুন থ্রেড তৈরি করে। এই সময়সূচী ব্যয়বহুল কারণ প্রতিবার নতুন থ্রেড তৈরি হয় এবং কোনও পুনরায় ব্যবহার হয় না।

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

RxAndroid এক্সটেনশন লাইব্রেরি দ্বারা RxJava তে প্রধান থ্রেড বা অ্যান্ড্রয়েডশেল্ডার.মেনথ্রেড () সরবরাহ করা হয়েছে। প্রধান থ্রেড (ইউআই থ্রেড নামেও পরিচিত) সেখানে ব্যবহারকারীর মিথস্ক্রিয়া ঘটে। জাঙ্কি-অ-প্রতিক্রিয়াশীল ইউআই বা আরও খারাপভাবে অ্যাপ্লিকেশন নয়, সাড়া না দেওয়ার জন্য এই থ্রেডটি ওভারলোড না করার বিষয়ে যত্ন নেওয়া উচিত (এএনআর) ডায়ালগ।

শিডিউলারস.সিংল () আরএক্সজাভা ২ এ নতুন This এই শিডিয়ুলারের অনুরোধ অনুসারে ক্রমানুসারে একক থ্রেড সম্পাদনকারী কার্যগুলি সমর্থন করে।

সময়সূচী.ট্র্যামপোলিন () অংশগ্রহণকারী কর্মী থ্রেডগুলির মধ্যে একটি দ্বারা একটি ফিফো (ফার্স্ট ইন, ফার্স্ট আউট) পদ্ধতিতে কার্য সম্পাদন করে। কল স্ট্যাক বৃদ্ধি না এড়াতে পুনরাবৃত্তি বাস্তবায়ন করার সময় এটি প্রায়শই ব্যবহৃত হয়।

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