首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Schedulers.computation和Schedulers.io的实现有什么不同?

Schedulers.computation和Schedulers.io的实现有什么不同?
EN

Stack Overflow用户
提问于 2016-04-08 14:20:10
回答 2查看 891关注 0票数 3

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-08 14:25:27

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

计算是纯粹的CPU限制,所以您希望限制线程的数量,这样它们就不会为CPU而争斗,而饿死自己。如果您有1000个线程都试图在8个内核上工作,您可能会有一个糟糕的时间。Schedulers.computation()以核数为上限。

I/O是不同的,因为虽然他们通常需要一个线程来维护上下文,但他们并不真正使用CPU --他们只是睡到I/O完成为止。在一台单核机器上进行1000个I/O操作是非常好的,因为它们大部分时间都在睡觉。Schedulers.io()未加上限,并将根据需要生成多个线程

票数 11
EN

Stack Overflow用户

发布于 2018-07-19 13:08:14

最重要的一点是,Schedulers.io和Schedulers.computation都由无界自动回收线程池支持。这个特性只由Schedulers.from(执行器)共享,如果执行器是用newCachedThreadPool创建的(在自动回收线程池中没有限制)。

默认情况下,Schedulers.computation配置的线程数量等于可用CPU的数量,因此计算将尽可能快地执行。您可以增加这个数目,但这可能会引入线程切换开销,并减慢计算速度。

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

尽管如此,这些调度程序的一个重要作用是向flatMap()操作符提供多线程上下文,在反应流的核心启用并发性。

从类似的问题这里以及关于RxJava2、调度器并发性的文章中可以找到更多的详细信息,在这些文章中您可以找到详细的解释和代码示例。

希望这能帮上忙

软贾克

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36502037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档