Schedulers.computation和Schedulers.io?

时间:2016-04-08 14:20:10

标签: java rx-java reactivex

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

  

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


  

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

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:0)

最重要的一点是Schedulers.io和Schedulers.computation都由无限制的自动回收线程池支持。如果执行程序是使用newCachedThreadPool(不受自动回收线程池限制)创建的,则只有Scheduler.from(Executor)共享此特征。

默认情况下,

Schedulers.computation 配置的线程数量等于可用CPU的数量,因此计算将尽可能快地执行。您可以增加此数量,但可能会导致线程切换开销并减慢计算速度。

对于 Schedulers.io ,您应该仅将其用于阻止I / O操作,因为它们会阻止调用线程。如果您的I / O调用是通过异步或反应性API进行的,则不要使用它,因为没有机制可以在 Scheduler.io 上进行回调。

话虽如此,这些调度程序的重要作用是为 flatMap()运算符提供多线程上下文,从而在反应流的核心实现并发。

通过类似的问题here和有关RxJava2 SchedulersConcurrency的文章查找更多详细信息,您可以在其中找到详细的说明和代码示例。

希望这会有所帮助,

Softjake