Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 异步I/O是否消耗线程?_Scala_Scalability_Akka_Reactive Programming - Fatal编程技术网

Scala 异步I/O是否消耗线程?

Scala 异步I/O是否消耗线程?,scala,scalability,akka,reactive-programming,Scala,Scalability,Akka,Reactive Programming,我正在尝试探索阿克卡演员,并确定他们的利益。我知道许多参与者可以共享同一个线程,从而获得巨大的效率——但是在web应用程序的上下文中,web容器应该在请求之间执行相同的操作,对吗 因此好处可以归结为I/O阻塞I/O暂停线程,不让其他人使用 异步I/O是否消耗线程?当我得到某个I/O结果的未来时,在I/O完成时是否会使用线程?TL;DR on the accepted Response:不,线程不被Aysn同步I/O使用,但线程用于从内核检索I/O结果 此外,来自: 在有事件的服务器上,等待I/O

我正在尝试探索阿克卡演员,并确定他们的利益。我知道许多参与者可以共享同一个线程,从而获得巨大的效率——但是在web应用程序的上下文中,web容器应该在请求之间执行相同的操作,对吗

因此好处可以归结为I/O阻塞I/O暂停线程,不让其他人使用


异步I/O是否消耗线程?当我得到某个I/O结果的未来时,在I/O完成时是否会使用线程?

TL;DR on the accepted Response:不,线程不被Aysn同步I/O使用,但线程用于从内核检索I/O结果

此外,来自:

在有事件的服务器上,等待I/O非常便宜:空闲请求的成本可以忽略不计,因为它们不会占用线程


Java异步I/O模型的描述非常容易掌握。基本思想是有一个内部线程池,它从内核检索完成的I/O通知,然后分派给其他线程对其执行所需的操作

所以,在某种意义上,是的,它使用线程。还有一点需要考虑:一切都是如此。每一个软件都需要一个过程,在某个时刻,检查一个I/O是否已经完成,以便它可以对其执行后续任务(好吧,它可以是fire-and-forget,但对于实际问题来说这有点有限)。在以异步I/O闻名的nodejs上,该线程被称为“事件循环”(尽管整体模型非常不同)

这里的要点是,每个I/O操作并不对应一个线程。相反,只有一个内部线程池负责接收所有异步I/O完成事件,然后在完成事件时采取所需的任何操作

也许更好的问题是:Java中的异步I/O消耗线程的数量是否与正在处理的I/O请求的数量成比例?不,没有;它消耗固定数量的线程。更有用的问题:在Java中启动异步I/O时,是否会阻止启动I/O的线程?不,它没有;它立即返回。与本主题相关的问题是:Java中的异步I/O是否使用actor线程池中的线程?不,没有


接下来是异步I/O返回的未来。虽然I/O没有完成,但不会使用线程。但是,有一个线程池分配给该未来的完成,当I/O完成时,该池中的一个线程将用于执行与该未来的完成相关联的操作。一旦这些操作完成,线程将返回到该线程池。该线程池可能不会与演员使用的线程池相同(尽管我认为可能有办法做到这一点)。

是的,这是正确的-但它只适用于非阻塞I/O。你不能简单地通过在其上撒一些Akka魔法将阻塞I/O变成非阻塞I/O,它不是这样工作的。这是node.js社区中的一个众所周知的问题,导致许多库被重写以执行异步I/O。令人惊讶的是,在JVM世界中,异步数据库访问没有与JDBC等价的东西,虽然有少数数据库有异步API,可以从Java和Scala中使用。顺便说一下,在python世界中,通过在阻塞IO上撒一些魔法,将其变成非阻塞IO,这就是全部内容。@om nom nom谢谢,很有趣!我正在考虑使用元编程来实现这一点,但方式非常不同。另一个要研究的想法!我相信akka的
implict val exec=context.dispatcher
意味着IO结果将在同一线程池中检索。我考虑过修改我的问题,以便更清楚地说明比例,但您的答案可能是“不,它不消耗线程,但它确实使用线程”。标记为答案,因为它是深入的。@Stephen可能有隐式的,但Java不使用隐式,所以它会忽略这一点。如果您使用的是来自其他库的异步i/o,那么您必须查看它自己的文档。假设您仍然可以使用
context.dispatcher
来执行
未来的执行?@Stephen是的,但是请注意Scala
未来的执行不会使I/O异步!如果您执行类似于
Future{blockingIO()}
的操作,您将在I/O上阻塞一个线程。您可以使用
Promise
创建
Future
并将其与异步回调相结合。