我使用的是带有Spring boot的RxJava。现在,对于每个请求,我启动了一个比方说10个子线程(使用Schedulers.nextThread())。
我将在生产环境中使用它,在那里我可以并发处理多达500个请求。
所以我的问题是a)这是一个很好的实践吗?b)我可以添加要生成的线程数量的上限吗?c)我可以在Java中运行多少个并发线程(比如32 in的RAM)?
所以在我的情况下,如果我有500个并发请求,并且每个请求都有10个线程,那么总共有5500个并发线程。
在生产环境中线程的数量是否正常。
发布于 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代码中处理队列。
发布于 2018-04-08 16:15:33
对于网络调用,应该使用Schedulers.io()而不是Schedulers.newThread()。因为创建线程的开销很大,所以&您会因为上下文切换开销而损害性能,在太多的线程之间切换。
如果您需要限制同时进行的网络调用的数量,请使用Scheduler.from(Executors.newFixedThreadPool(n))。
https://stackoverflow.com/questions/49671090
复制相似问题