我试图在创建AsyncHttpClient时设置事件循环组,但我想了解创建和设置eventLoop的输入参数。
NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(32, Executors.newScheduledThreadPool(33));
AsyncHttpClient asyncHttpClient = return asyncHttpClient(
config().setConnectTimeout(30000).setRequestTimeout(5000).setEventLoopGroup(eventLoopGroup));
对于new NioEventLoopGroup
,第一个参数和Executor的线程池大小有什么区别?当我设置这个值并检查执行器时,32个线程是“新I/O”线程,1个线程用于线程池执行请求。这将导致超时。将线程池大小设置为N个线程的最佳方法是什么?
1条答案
按热度按时间2ic8powd1#
第一个参数
nThreads
是要创建的事件循环的数量,第二个参数是executor(在您的情况下,具有恒定的线程池)。当一个组被调用执行一些任务时,它会将它们放入每个循环中。Executor将循环放入池中的线程中,循环在该线程中一直工作,直到Executor或线程强制关闭。(您在检查器中看到的池中32个已使用的线程可能是因为循环已经在其中运行/等待)如果executor不知何故丢失了一些线程或阻塞了它们,或者您分配的线程数量较低,那么nThreads - remaining循环将对接收到的任务进行排队,但不执行任何操作。
我实际上建议使用普通的执行器,它将创建所有需要的线程数量,你不会偶然发现任何循环缺少它的线程。