Schedulers.computation和Schedulers.io的实现有何不同?

Xit*_*rum 2 java rx-java reactivex

为什么他们被用于不同类型的任务?在处理计算任务与io任务时,它们的不同之处是什么?

Schedulers.computation() - 用于计算工作,如事件循环和回调处理; 不要将此调度程序用于I/O(改为使用Schedulers.io()); 默认情况下,线程数等于处理器数


Schedulers.io() - 用于I/O绑定工作,例如阻塞I/O的异步性能,此调度程序由一个将根据需要增长的线程池支持; 对于普通的计算工作,切换到Schedulers.computation(); 默认情况下,Schedulers.io()是一个CachedThreadScheduler,它类似于带有线程缓存的新线程调度程序

Dar*_*oid 8

I/O和Computation是非常不同的工作负载.

计算完全是CPU绑定的,因此您希望限制线程数,以便它们不会争夺CPU并使自己饿死.如果你有1000个线程都试图在8个核心上工作,那么你可能会遇到困难.Schedulers.computation()的上限为内核数.

I/O是不同的,因为虽然它们通常需要一个线程来维护上下文,但它们并不真正使用CPU - 它们只是睡眠直到I/O完成.在单核机器上进行1000次I/O操作是完全没问题的,因为它们在大多数时间都处于睡眠状态.Schedulers.io()是无上限的,并将根据需要生成尽可能多的线程