java - Quasar 的光纤中的阻塞 IO 是否会阻塞其线程池中的线程?

标签 java akka actor fibers quasar

据我所知,在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/

相关文章:

scala - 将多个 future 与多个远程参与者一起使用时,程序会挂起

scala - 函数 "eventloop"在 Scala Actors 中有什么作用?

java - 通过 SSL 以明文形式发送登录信息?

java - rs.getInt(1) 无法正常工作

scala - 多个 http 请求的 Akka 流程

Scala AKKA 访问变量或返回值

java - 如何在 Akka 中找到特定的 Actor

基于返回类型的 Java 泛型转换?

java - 使用改造库更新 GPS 位置并将坐标发送到服务器(在后台服务中)

scala - Akka Streams - 如何检查流是否成功运行?