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

Does a blocking IO in Quasar's fiber block a thread in its threadpool?

据我所知,在 Akka 中,所有 actor 都是通过线程池进行调度的。太多actors同时执行阻塞IO,每次阻塞调用阻塞一个线程,导致线程中断。

现在我正在研究 JVM 上一个有趣的纤程实现 -- Quasar 它允许大量用户线程 -- 纤程 -- 并使用线程池来调度它们。但是,我想知道当许多纤程调用遗留阻塞时是否有好处 APIs.

我认为这不会有帮助,因为阻塞 API 仍然会阻塞系统线程,而 Quasar 无法神奇地将其转为仅阻塞光纤。这只是我的猜测,如有错误请指正。

Quasar fibers 被实现为在 ForkJoinPool.

上创建和安排的连续任务(默认情况下,但如果您愿意,甚至可以针对每个 fiber 进行自定义)

你是对的,Quasar不会"magically"将一个JDK/JVM线程转换成一个fiber,所以目前线程阻塞调用会阻塞线程池中的一个线程(而Quasar发生这种情况时会打印警告)。如果它发生的时间很短而且很少发生,这不是什么大问题,否则最好采取一些措施。

如果你幸运的话,which is likely and it's getting more and more likely,有人已经为你的线程阻塞编写了一个集成模块 API 并提供了它的光纤阻塞实现。如果是这种情况,那么您只需要对代码进行微小的更改(如果有的话),就可以从低效的线程阻塞切换到高效的光纤阻塞。

否则你可以靠自己的运气,自己写一个集成,通常是very easy. If you do so, please consider integrating it back into Comsat