据我所知,在Akka中,所有参与者都安排在一个线程池上。太多actor同时执行阻塞IO,每个阻塞调用阻塞一个线程,导致线程中断。
现在我正在研究 JVM 上的一个有趣的光纤实现——Quasar,它允许大量用户线程——光纤——并使用线程池来调度它们。但是,我想知道当许多纤程调用遗留阻塞 API 时是否有好处。
我不认为这会有所帮助,因为阻塞 API 仍然会阻塞系统线程,并且 Quasar 无法神奇地将其转换为仅阻塞光纤。这只是我的猜测,如果我错了,请纠正我。
Quasar 纤程实现为在ForkJoinPool
.
没错,Quasar 不会“神奇地”将 JDK/JVM 线程转换为纤程,因此目前线程阻塞调用将阻塞线程池中的线程(并且当发生这种情况时,Quasar 会打印警告)。如果它发生的时间很短并且很少发生,这不是一个大问题,否则最好采取一些措施。
不过,如果您很幸运,而且这种可能性越来越大,那么有人已经为您的线程阻塞 API 编写了一个集成模块,并提供了它的光纤阻塞实现。如果是这种情况,那么您只需要对代码进行微小的更改(如果有的话),就可以从低效的线程阻塞切换到高效的光纤阻塞。
否则,您可以建立自己的运气并自己编写集成,这通常很 容易。如果您这样做,请考虑将其重新集成到 Comsat中。