Rxjava Schedulers.newThread () ile Schedulers.io () ile Güçlendirme


84

Ne kullanmak faydaları vardır Schedulers.newThread()vs Schedulers.io()içinde Retrofitağ isteği. Kullanan birçok örnek gördüm io()ama nedenini anlamak istiyorum.

Örnek durum:

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

vs

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

Gördüğüm nedenlerden biri -

newThread()her çalışma birimi için yeni bir iş parçacığı oluşturur. io()iş parçacığı havuzu kullanacak

Peki bu argümanın uygulama üzerindeki etkisi nedir? Ve başka hangi yönler var?

Yanıtlar:


99

Kullanmanın yararının, Schedulers.io()bir iş parçacığı havuzu kullanmasına rağmen kullanmamasında yattığı konusunda haklısınız Schedulers.newThread().

İş parçacığı havuzlarını kullanmayı düşünmenizin birincil nedeni, boşta olan ve çalışmayı bekleyen önceden oluşturulmuş bir dizi iş parçacığı bulundurmalarıdır. Bu, yapılacak işiniz olduğunda, bir iş parçacığı oluşturmanın ek yükünden geçmenize gerek olmadığı anlamına gelir. İşiniz bittiğinde, bu iş parçacığı sürekli olarak iş parçacıkları oluşturmak ve yok etmek yerine gelecekteki işler için yeniden kullanılabilir.

İş parçacığı oluşturmak pahalı olabilir, bu nedenle anında oluşturduğunuz iş parçacığı sayısını en aza indirmek genellikle iyidir.

İş parçacığı havuzları hakkında daha fazla bilgi için şunları tavsiye ederim:


4
Scheduler.io () 'nun, bazı kullanım durumları için uygun olmayabilecek sınırsız bir iş parçacığı havuzunu temel alması hakkında bir yorum eklemeye değer olabilir. Stackoverflow.com/questions/31276164/… sayfasına
Dave Moten

@DaveMoten Hangi kullanım durumları aracılığıyla iş parçacığı havuzu için uygun değildir Schedulers.io?
IgorGanapolsky

3
Yapacak çok sayıda eşzamanlı işiniz Schedulers.io()varsa, işletim sistemi g / Ç sınırlarına (örneğin, maksimum açık dosya sayısı, güvenilirlik amacıyla elden çıkarıldıktan sonra bile bir süre açık kalabilen maksimum tcp bağlantı sayısı) çarpabilirsiniz. . Her yeni iş parçacığı ayrıca minimum önemsiz miktarda RAM gerektirir (> 512K ancak 1M'de çalışır), böylece RAM'iniz tükenebilir.
Dave Moten

Bu iş parçacıkları aynı hafızayı mı paylaşıyor? örneğin, bir io iş parçacığında oluşturulan ve başka bir io iş parçacığında erişilen nesne.
Eido95

1
@ Eido95 aynı yığını değil, aynı yığını paylaşırlar. Değişkenler söz konusu olduğunda, evet, değişkenleri iş parçacıkları arasında paylaşabilirsiniz (bu değişkenlerin iş parçacığı güvenli olduğundan emin olmak için tüm tipik uyarılarla birlikte).
Bryan Herbst
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.