26

RxJava调度选择

 5 years ago
source link: https://www.tuicool.com/articles/VNjaU3B
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在RxJava中有 5种不同的调度程序 可供选择:

  1. immediate() :创建并返回一个在当前线程上立即执行工作的Scheduler。
  2. trampoline() :创建并返回一个Scheduler ,该Scheduler 所在线程并不会立即工作,而是要等待我们所设定的等待时间结束后才可以执行(默认为0),当然,这个延时设置是要设定在Runnable实现内部。还有一点就是所有任务要添加到一个队列中,然后依次执行即可。
  3. newThread() :创建并返回一个Scheduler,为每个任务创建一个新的Thread。
  4. computation() :创建并返回用于计算工作的Scheduler。它可以用于事件循环,处理回调和其他计算工作。注意不要使用该Scheduler执行IO类型的工作,对此,我们可以使用 io() 代替。
  5. io() :创建并返回一个用于IO类型工作的Scheduler。该实现维护了一个Executor线程池,该线程池可根据需要增长。该Scheduler可用于异步执行阻塞IO。不要使用该Scheduler执行计算任务。

问题:

前3个Scheduler解释的非常到位,对 computation()io() 有点困惑。

  1. 究竟什么是“IO-bound work”?它适用于处理streams( java.io )和files( java.nio.files )吗?适用于数据库查询吗?适用于下载文件还是访问REST API?
  2. computation()newThread() 有什么不同之处?
  3. 为什么在进行IO任务时调用 computation() 会很糟糕?
  4. 为什么在进行计算任务时调用 io() 会很糟糕?

    答案:

很棒的问题,我认为文档可以提供更多细节。

  1. io() 由无限制线程数量的线程池支持,用于执行非计算密集型任务,这些任务不会对CPU造成太大负担(比如主板上的南北桥芯片,南桥芯片主要负责软驱、硬盘、键盘以及附加卡的数据交换)。因此,与文件系统的交互,与不同主机上的数据库或服务的交互就是很好的适用场景。
  2. computation() 由有限数量的线程池支持,其大小等于可用处理器的数量。如果你试图在可用处理器之外并行安排cpu密集型工作(比如使用 newThread() ),那么当线程争夺处理器时,你就会面临线程创建开销和上下文切换开销,并且它可能会受到很大的性能影响。
  3. 最好只留下 computation() CPU密集型工作,否则你将无法获得良好的CPU利用率。
  4. io() 根据 2 中所讲,在进行计算任务时使用 io() 是很不好的,如果你 io() 并行安排了一千个计算任务,那么这千个任务中的每一个都将拥有自己的线程并争夺CPU产生的上下文切换成本。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK