gpt4 book ai didi

node.js - Scala 真的是异步的吗

转载 作者:搜寻专家 更新时间:2023-11-01 00:31:31 25 4
gpt4 key购买 nike

最近我正在研究 Scala 以编写非阻塞 Restful API。我已经在 node.js 中完成了几个项目,这次很想研究一下 Scala。

到目前为止,我的发现是不可能在 Scala 中编写 100% 的异步代码,因为大多数底层代码都是阻塞的。您可以找到有关如何在 Scala 应用程序中使用 JDBC 进行数据库连接的教程。 JDBC 阻塞意味着任何使用它的应用程序都不能在单线程环境中工作,因为它会在等待数据库响应时排队所有其他请求。Play Framework 建议在使用阻塞 API 时增加线程池,这意味着我们要回到从哪里我们开始了。

至于node.js,几乎所有可用的模块都是异步编写的。特别是所有数据库连接器和文件处理程序都是异步读/写的,请记住,当您只有一个线程时,没有任何东西可以阻塞。然而,我看到人们更喜欢 Scala 而不是 node.js,因为它在异步时具有类型安全性和计算能力。但是异步行为并未反射(reflect)在大多数在线可用的教程和资源中。

我的问题是,只有我不明白这一点,还是在 JVM 世界中混淆了异步的真正含义?

更新:

我知道同步的 JDBC 不会使 Scala 同步,但我看到有人争辩说他们的 API 是非阻塞的,但他们使用的是同步库。此外,如果大多数驱动程序和库仍然阻塞,如何在 Scala 中编写非阻塞应用程序。即使有替代方案,这也意味着您在使用库检查其内部结构以查看其是阻塞还是非阻塞时必须非常小心,而 node.js 则不是这种情况。

最佳答案

用 Scala(和 Java)编写异步应用程序是可能的(我什至会说很容易)但是你必须小心第三方库,知道哪些 API:s 是阻塞和异步。

例如,Java 标准库提供了阻塞和非阻塞 IO API。

JDBC 是另一个常见的 API 固有阻塞示例,如果您想编写 100% 异步应用程序,您只需为您的数据库使用不同的客户端。

与 node.js 的一大区别是您实际上可以处理阻塞 API:s 以及异步内容。这是可能的,因为我们在 JVM 中有多线程,并且可以在针对该任务调整的单独线程池中运行阻塞的东西。因此,如果我们有 8 个可能阻塞的数据库连接,我们可以在具有 8 个线程的线程池上运行这些连接,而不会在“常规”线程池上阻塞任何异步代码。

附带说明一下,我们拥有并发性还允许我们让每个内核有一个线程来并行运行异步代码,而不是一个线程用于整个虚拟机。

关于node.js - Scala 真的是异步的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31717996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com