Actualización con Rxjava Schedulers.newThread () vs Schedulers.io ()

84

¿Cuáles son los beneficios de usar Schedulers.newThread()frente Schedulers.io()a Retrofituna solicitud de red? He visto muchos ejemplos que usan io(), pero quiero entender por qué.

Situación de ejemplo:

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

vs

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

Una de las razones por las que he visto es:

newThread()crea un nuevo hilo para cada unidad de trabajo. io()usará un grupo de subprocesos

Pero, ¿cuál es la influencia de ese argumento en la aplicación? ¿Y qué otros aspectos hay?

Mikelis Kaneps
fuente

Respuestas:

99

Tiene razón en que el beneficio de usar Schedulers.io()radica en el hecho de que usa un grupo de subprocesos, mientras Schedulers.newThread()que no lo hace.

La razón principal por la que debería considerar el uso de grupos de subprocesos es que mantienen una serie de subprocesos creados previamente que están inactivos y esperando el trabajo. Esto significa que cuando tiene trabajo por hacer, no necesita pasar por la sobrecarga de crear un hilo. Una vez que haya terminado su trabajo, ese hilo también se puede reutilizar para trabajos futuros en lugar de crear y destruir hilos constantemente.

Los subprocesos pueden ser costosos de crear, por lo que minimizar el número de subprocesos que está creando sobre la marcha es generalmente bueno.

Para obtener más información sobre los grupos de subprocesos, recomiendo:

Bryan Herbst
fuente
4
Podría valer la pena agregar un comentario sobre Scheduler.io () que se basa en un grupo de subprocesos ilimitado que podría no ser apropiado para algunos casos de uso. Ver stackoverflow.com/questions/31276164/…
Dave Moten
@DaveMoten ¿Qué casos de uso son inapropiados para el grupo de subprocesos a través Schedulers.io?
IgorGanapolsky
3
Si tiene mucho trabajo simultáneo que hacer, Schedulers.io()entonces podría toparse con los límites de E / S del sistema operativo (por ejemplo, el número máximo de archivos abiertos, el número máximo de conexiones tcp que, por razones de confiabilidad, pueden permanecer abiertas durante un período incluso después de ser desechadas) . Cada nuevo hilo también requiere una cantidad mínima no trivial de RAM (> 512K pero funciona en 1M) por lo que podría quedarse sin RAM.
Dave Moten
¿Esos hilos comparten la misma memoria? por ejemplo, objeto creado en un subproceso io y al que se accede en otro subproceso io.
Eido95
1
@ Eido95 comparten el mismo montón, no el mismo montón. En cuanto a las variables, sí, puede compartir variables entre subprocesos (con todas las advertencias típicas sobre cómo asegurarse de que esas variables sean seguras para subprocesos).
Bryan Herbst