首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rxjava Schedulers.newThread()上限

Rxjava Schedulers.newThread()上限
EN

Stack Overflow用户
提问于 2018-04-05 19:20:07
回答 2查看 1.3K关注 0票数 2

我使用的是带有Spring boot的RxJava。现在,对于每个请求,我启动了一个比方说10个子线程(使用Schedulers.nextThread())。

我将在生产环境中使用它,在那里我可以并发处理多达500个请求。

所以我的问题是a)这是一个很好的实践吗?b)我可以添加要生成的线程数量的上限吗?c)我可以在Java中运行多少个并发线程(比如32 in的RAM)?

所以在我的情况下,如果我有500个并发请求,并且每个请求都有10个线程,那么总共有5500个并发线程。

在生产环境中线程的数量是否正常。

EN

回答 2

Stack Overflow用户

发布于 2018-04-06 03:21:18

没有充分的理由产生这么多的线程。同时可执行代码的数量受到您可以访问的CPU核心数量的限制。台式机可能有两个或四个核心,而服务器可能有几十个核心。

您需要的是一个由执行器管理的线程池,比如ScheduledExecutorService。这可以由Schedulers.from()包装,以创建一个与RxJava一起使用的调度程序。通常,您将构建一个不超过两倍核心数的线程池。

当您使用observeOn()subscribeOn()操作符时,传入的调度程序用于为该观察链选择单个线程。

对于500个并发请求和一个20核的服务器,您一次只能处理不超过20个操作,这意味着您必须将请求排队等待处理。如果您创建了5,000或40个线程,则一次仍只能推进20个请求。如果创建5,000个线程,则要求executor处理队列;如果创建40个线程,则在RxJava代码中处理队列。

票数 2
EN

Stack Overflow用户

发布于 2018-04-08 16:15:33

对于网络调用,应该使用Schedulers.io()而不是Schedulers.newThread()。因为创建线程的开销很大,所以&您会因为上下文切换开销而损害性能,在太多的线程之间切换

如果您需要限制同时进行的网络调用的数量,请使用Scheduler.from(Executors.newFixedThreadPool(n))

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

https://stackoverflow.com/questions/49671090

复制
相关文章

相似问题

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