【发布时间】:2015-07-30 17:57:28
【问题描述】:
这些天我正在研究 Scala 以编写一个非阻塞的 Restful API。我已经在 node.js 中完成了几个项目,这次我很想研究 Scala。
到目前为止,我的发现是,在 Scala 中编写 100% 异步代码是不可能的,因为大多数底层代码都是阻塞的。您可以找到有关如何在 Scala 应用程序中使用 JDBC 进行数据库连接的教程。 JDBC 被阻塞意味着任何使用它的应用程序都不能在单线程环境中工作,因为它会在等待 DB 响应时将所有其他请求排队。Play 框架建议在使用阻塞 API 时增加线程池,这意味着我们将从哪里返回我们开始了。
对于 node.js,几乎所有可用的模块都是异步编写的。特别是所有数据库连接器和文件处理程序都是异步读/写的,请记住,当您只有一个线程时,没有任何东西可以阻塞。然而,我看到人们更喜欢 Scala 而不是 node.js,因为它的类型安全性和计算能力,同时是异步的。但是异步行为并没有反映在大多数在线可用的教程和资源中。
我的问题是,只有我没有理解这一点,还是在 JVM 世界中对异步的实际含义存在混淆?
更新:
我知道 JDBC 同步不会使 Scala 同步,但我看到有人争辩说他们的 API 是非阻塞的,但他们使用的是同步库。此外,如果大多数驱动程序和库仍然是阻塞的,如何在 Scala 中编写非阻塞应用程序。即使有替代方案,这也意味着在使用库检查其内部结构时必须非常小心,看看它是阻塞还是非阻塞,而 node.js 不是这种情况。
【问题讨论】:
-
在这个问题中 JDBC 与 Scala 是异步的存在混淆。
-
Scala 或 Node.js 本质上都不是异步的,但它们的库是异步的。考虑到 JDBC,作为同步的低级别,但上面有异步库(Slick,Anorm)。
-
是的 JDBC 是同步的,但我看到了编写非阻塞服务器的教程,但他们正在使用 JDBC 或以阻塞方式处理文件。
-
非阻塞(在 Typesafe 意义上)== 线程没有被非活动进程占用。没有等待或睡眠。相反,该线程正在分配给目前需要它的人。
-
是的,但是如果存在的唯一线程对 DB 进行查询并等待响应,则没有其他线程可以处理其他请求。在这种情况下,线程很可能处于等待状态。
标签: node.js scala asynchronous java-8 nonblocking