我正在使用RxJava和Spring启动。 现在对于每个请求,我开始说10个子线程(使用Schedulers.nextThread())。
我将在生产环境中使用它,在那里我可以拥有多达500个请求的并发
所以我的问题是 a)这是好的做法。 b)是否有任何上限我可以添加到产生的线程数? c)我可以在Java中运行多少并发线程(比如32GB RAM)?
所以我的情况是,如果我有500个并发请求,并且每个请求都会产生10个线程,那么总计5500个并发线程。
生产环境中的线程数是否正常。
答案 0 :(得分:1)
没有充分的理由产生那么多线程。可同步执行的代码段数受限于您有权访问的CPU核心数。台式机可能有两个或四个内核,而服务器可能有几十个内核。
您想要的是由执行程序管理的线程池,例如ScheduledExecutorService
。这可以由Schedulers.from()
包装,以创建与RxJava一起使用的调度程序。通常,您将构造一个不超过核心数两倍的线程池。
使用observeOn()
或subscribeOn()
运算符时,传入的调度程序用于为该观察者链选择单独的线程。
通过500个并发请求和一个20核服务器,您一次可以处理不超过20个操作,这意味着您必须对要处理的请求进行排队。如果您创建5,000或40个线程,则一次只能提前20个请求。如果您创建5,000个线程,则要求执行程序处理排队;如果创建40个线程,则在RxJava代码中处理排队。
答案 1 :(得分:0)
对于网络通话,请使用Schedulers.io()
代替Schedulers.newThread()
。因为线程创建成本高昂而且由于太多线程之间的上下文切换开销,你会损害性能。
如果您需要限制同时进行网络通话的次数,请使用Scheduler.from(Executors.newFixedThreadPool(n))
。