Rxjava Schedulers.newThread () बनाम Schedulers.io () के साथ रेट्रोफिट


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
शेड्यूलर के बारे में टिप्पणी जोड़ने के लायक हो सकता है। () एक अनबाउंड थ्रेड पूल पर आधारित है जो कुछ उपयोग मामलों के लिए उपयुक्त नहीं हो सकता है। देखें stackoverflow.com/questions/31276164/...
डेव Moten

@DaveMoten थ्रेड पूल के लिए कौन से उपयोग के मामले अनुपयुक्त हैं Schedulers.io?
इगोरगानापोलस्की

3
यदि आपके पास करने के लिए बहुत से समवर्ती कार्य हैं, Schedulers.io()तो आप OS i / o की सीमाओं से टकरा सकते हैं (उदाहरण के लिए अधिकतम खुली हुई फ़ाइलें, अधिकतम tcp कनेक्शन जो विश्वसनीयता उद्देश्यों के लिए निपटाए जाने के बाद भी अवधि के लिए खुला रह सकता है) । प्रत्येक नए थ्रेड के लिए न्यूनतम गैर-तुच्छ राशि RAM (> 512K लेकिन 1M पर काम करना) की आवश्यकता होती है ताकि आप RAM से बाहर निकल सकें।
दवे मोटेन

क्या वे धागे उसी स्मृति को साझा करते हैं? उदाहरण के लिए एक io थ्रेड में बनाई गई वस्तु और दूसरे io थ्रेड में एक्सेस किया जा रहा है।
Eido95

1
@ Eido95 वे एक ही ढेर साझा करते हैं, एक ही ढेर नहीं। जहाँ तक चर जाते हैं, हाँ आप थ्रेड्स के बीच चर साझा कर सकते हैं (सभी विशिष्ट चेतावनियों के बारे में यह सुनिश्चित करने के लिए कि वे चर थ्रेड-सुरक्षित हैं)।
ब्रायन हर्बस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.