আরএক্সজাভা শিডিয়ুলার্সের সাথে পুনঃনির্মাণ


84

কি সুবিধা ব্যবহার করতে হয় Schedulers.newThread()বনাম Schedulers.io()মধ্যে Retrofitনেটওয়ার্ক অনুরোধের। আমি ব্যবহার করে এমন অনেক উদাহরণ দেখেছি io(), তবে কেন তা বুঝতে চাই।

উদাহরণ পরিস্থিতি:

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())...

বনাম

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())...

আমি যে কারণগুলি দেখেছি তার মধ্যে একটি হ'ল -

newThread()কাজের প্রতিটি ইউনিটের জন্য একটি নতুন থ্রেড তৈরি করে। io()একটি থ্রেড পুল ব্যবহার করবে

কিন্তু অ্যাপটিতে সেই যুক্তির প্রভাব কী? এবং অন্যান্য দিক আছে কি?

উত্তর:


99

আপনি সঠিক যে এটি Schedulers.io()একটি থ্রেড পুল ব্যবহার করে সত্য মিথ্যা ব্যবহার করে যে সুবিধা Schedulers.newThread()হয় না।

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

থ্রেডগুলি তৈরি করা ব্যয়বহুল হতে পারে, তাই আপনি ফ্লাইতে যে থ্রেডগুলি তৈরি করছেন তা হ্রাস করুন সাধারণত ভাল।

থ্রেড পুল সম্পর্কে আরও তথ্যের জন্য, আমি সুপারিশ করছি:


4
একটি আনবাউন্ডেড থ্রেড পুলের ভিত্তিতে শিডিয়ুলেরিয়ো () সম্পর্কে একটি মন্তব্য যুক্তিযুক্ত হতে পারে যা কিছু ব্যবহারের ক্ষেত্রে উপযুক্ত নাও হতে পারে। স্ট্যাকওভারফ্লো
ডেভ মোটেন

@ ডেভমোটেন থ্রেড পুলের মাধ্যমে কোন ব্যবহারের ক্ষেত্রে অনুপযুক্ত Schedulers.io?
ইগোরগানাপলস্কি

4
যদি আপনার সাথে অনেকগুলি সহবর্তী কাজ করা থাকে Schedulers.io()তবে আপনি ওএস আই / ও-এর সীমাতে ঝাঁপিয়ে পড়তে পারেন (উদাহরণস্বরূপ সর্বাধিক সংখ্যক খোলার ফাইল, সর্বাধিক সংখ্যক টিসিপি সংযোগ যা নির্ভরযোগ্যতার উদ্দেশ্যে নির্ধারিত হওয়ার পরেও সময়ের জন্য খোলা থাকতে পারে) । প্রতিটি নতুন থ্রেডেও সর্বনিম্ন অ-তুচ্ছ পরিমাণে র‌্যামের প্রয়োজন হয় (> 512 কে তবে 1 এম তে কাজ করুন) যাতে আপনি র‌্যামের বাইরে চলে যেতে পারেন।
ডেভ মোতেন

এই থ্রেডগুলি কি একই স্মৃতি ভাগ করে দেয়? যেমন একটি আইও থ্রেডে তৈরি হওয়া আইটেম এবং অন্য আইও থ্রেডে অ্যাক্সেস করা হচ্ছে।
oদো 95

4
@ Oদো 95 তারা একই স্তূপ ভাগ করে না, একই স্তুপ ভাগ করে। ভেরিয়েবল যতদূর যায়, হ্যাঁ আপনি থ্রেডগুলির মধ্যে ভেরিয়েবলগুলি ভাগ করতে পারেন (those ভেরিয়েবলগুলি থ্রেড-নিরাপদ কিনা তা নিশ্চিত করার বিষয়ে সমস্ত সাধারণ সতর্কতা সহ)।
ব্রায়ান হার্বস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.