Retrofit com Rxjava Schedulers.newThread () vs Schedulers.io ()

84

Quais são os benefícios de usar em Schedulers.newThread()relação Schedulers.io()à Retrofitsolicitação de rede. Já vi muitos exemplos que usam io(), mas quero entender por quê.

Situação de exemplo:

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

vs

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

Uma das razões que vi é -

newThread()cria um novo thread para cada unidade de trabalho. io()usará um pool de threads

Mas qual é a influência desse argumento no aplicativo? E que outros aspectos existem?

Mikelis Kaneps
fonte

Respostas:

99

Você está correto ao dizer que o benefício de usar Schedulers.io()reside no fato de que ele usa um pool de threads, ao passo Schedulers.newThread()que não usa.

O principal motivo pelo qual você deve considerar o uso de conjuntos de encadeamentos é que eles mantêm vários encadeamentos pré-criados que estão ociosos e aguardando o trabalho. Isso significa que quando você tem trabalho a fazer, não precisa passar pelo overhead de criar um thread. Assim que seu trabalho estiver concluído, esse thread também pode ser reutilizado para trabalhos futuros, em vez de criar e destruir threads constantemente.

Threads pode ser caro para criar, portanto, minimizar o número de threads que você está criando rapidamente é geralmente bom.

Para obter mais informações sobre pools de threads, recomendo:

Bryan Herbst
fonte
4
Pode valer a pena adicionar um comentário sobre Scheduler.io () ser baseado em um pool de threads ilimitado que pode não ser apropriado para alguns casos de uso. Consulte stackoverflow.com/questions/31276164/…
Dave Moten
@DaveMoten Quais casos de uso são inadequados para o pool de threads via Schedulers.io?
IgorGanapolsky
3
Se você tiver muito trabalho simultâneo para fazer Schedulers.io(), poderá esbarrar nos limites de i / o do sistema operacional (por exemplo, número máximo de arquivos abertos, número máximo de conexões tcp que, para fins de confiabilidade, podem permanecer abertas por um período, mesmo após serem descartadas) . Cada novo thread também requer uma quantidade mínima não trivial de RAM (> 512K, mas funciona em 1M) para que você possa ficar sem RAM.
Dave Moten
Esses tópicos compartilham a mesma memória? por exemplo, objeto criado em um thread io e sendo acessado em outro thread io.
Eido95 de
1
@ Eido95 eles compartilham a mesma pilha, não a mesma pilha. No que diz respeito às variáveis, sim, você pode compartilhar variáveis ​​entre threads (com todos os avisos típicos sobre como ter certeza de que essas variáveis ​​são seguras para threads).
Bryan Herbst de