据我所知,在Akka ,所有参与者都在一个线程池上进行调度。过多的actor同时执行阻塞IO,每个阻塞调用阻塞一个线程,导致线程中断。
现在我正在研究 JVM 上一个有趣的纤程实现 -- Quasar它允许大量用户线程——纤程——并使用线程池来调度它们。但是,我想知道当许多纤程调用遗留阻塞 API 时是否有好处。
我认为这不会有帮助,因为阻塞 API 仍然会阻塞系统线程,而 Quasar 无法神奇地将其转为仅阻塞纤程。这只是我的猜测,如果我错了请纠正我。
最佳答案
Quasar 纤程被实现为在 ForkJoinPool
上创建和调度的连续任务(默认情况下,但如果您愿意,甚至可以针对每个纤程进行自定义)。
你是对的,Quasar 不会“神奇地”将 JDK/JVM 线程转换为纤程,因此目前线程阻塞调用将阻塞线程池中的线程(当发生这种情况时,Quasar 会打印警告).如果这种情况发生的时间很短而且很少发生,这不是什么大问题,否则最好采取一些措施。
如果幸运的话,which is likely and it's getting more and more likely ,有人已经为您的线程阻塞 API 编写了一个集成模块,并提供了它的光纤阻塞实现。如果是这种情况,那么您只需对代码进行微小的更改(如果有的话),即可从低效的线程阻塞切换到高效的光纤阻塞。
否则你可以靠自己的运气,自己写一个集成,通常是very easy .如果这样做,请考虑 integrating it back into Comsat .
关于java - Quasar 的光纤中的阻塞 IO 是否会阻塞其线程池中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717948/