Nodejs 中工作线程如何工作?

2024-01-19

Nodejs 不能像 java 和 .net 那样有内置的线程 API 做。如果添加线程,语言本身的性质就会 改变。无法将线程添加为一组新的可用线程 类或函数。

Nodejs 10.x 添加了工作线程作为实验,现在从 12.x 开始稳定。我浏览了一些博客,但可能由于缺乏知识而不太了解。它们与线程有何不同。


Javascript 中的工作线程有点类似于浏览器中的 WebWorkers。它们不与主线程或彼此之间共享对任何变量的直接访问,它们与主线程通信的唯一方式是通过消息传递。该消息传递通过事件循环同步。这避免了多个线程尝试访问相同变量的所有经典竞争条件,因为两个单独的线程无法访问 Node.js 中的相同变量。每个线程都有自己的变量集,影响另一个线程变量的唯一方法是向其发送消息并要求其修改自己的变量。由于该消息是通过该线程的事件队列同步的,因此在访问变量时不存在经典竞争条件的风险。

另一方面,Java 线程与 C++ 或本机线程类似,因为它们共享对相同变量的访问,并且线程是自由时间片的,因此在线程 A 中运行的函数 A 中间,执行可能会被中断,而函数 B 在线程 B 中运行可以运行。由于两者都可以自由访问相同的变量,因此可能会出现各种竞争条件,除非手动使用线程同步工具(例如互斥体)来协调和保护对共享变量的所有访问。这种类型的编程通常是很难找到并且几乎不可能可靠地重现并发错误的根源。虽然对于某些系统级事物或更实时的代码来说功能强大且有用,但除了非常资深和经验丰富的开发人员之外,任何人都很容易犯下代价高昂的并发错误。而且,很难设计一个测试来告诉您它在所有类型的负载下是否真的稳定。

Node.js 试图通过将线程分离到它们自己的变量空间并强制它们之间的所有通信通过事件队列同步来避免经典的并发错误。这意味着 threadA/functionA 永远不会被任意中断,并且进程中的一些其他代码会更改它在不查看时正在访问的一些共享变量。

Node.js 还具有一个后备功能,它可以运行一个可以用任何语言编写的 child_process,并且可以在需要时使用本机线程,或者可以使用附加 SDK 将本机代码和真实系统级线程直接挂钩到 Node.js 中(并且它通过 SDK 接口与 Node.js Javascript 进行通信)。事实上,许多 Node.js 内置库正是这样做的,以提供需要对 NodeJS 环境进行访问级别的功能。例如,文件访问的实现使用本机线程池来执行文件操作。


因此,尽管如此,仍然可能发生某些类型的竞争条件,这与对外部资源的访问有关。例如,如果两个线程或进程都尝试做自己的事情并写入同一个文件,那么它们显然会相互冲突并产生问题。

所以,在node.js中使用Workers在访问外部资源时仍然要注意并发问题。 Node.js 保护每个 Worker 的局部变量环境,但无法对外部资源之间的争用采取任何措施。在这方面,node.js Workers 具有与 Java 线程相同的问题,程序员必须为此编写代码(独占文件访问、文件锁、每个 Worker 的单独文件、使用数据库来管理存储并发性等。 .)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs 中工作线程如何工作? 的相关文章

随机推荐

  • 在插入符中访问 rfe 生成的所有模型

    我正在使用rfecaret 包中的函数用于逻辑回归模型的特征选择 我正在看sizes5 10 15 20 和 25 使用 Rsquared 选择最佳模型 我的因变量是 0 1 有没有办法访问该公司生产的其他模型rfe功能超出最终选定的模型
  • 使用桌面应用程序部署 SQL Server Express 数据库?

    我已经在 NET 中创建了第一个基于数据库的桌面应用程序 但无法理解如何使用应用程序安装程序部署数据库 以便一次性安装数据库 应用程序和 SQL Server 如果我只使用安装程序部署 SQL Server 的本机客户端和数据库 它会起作用
  • mysql查询结果在php变量中

    有没有办法将mysql结果存储在php变量中 谢谢 query SELECT username userid FROM user WHERE username admin result conn gt query query 然后我想打印从
  • 如何在 Django 中制作类似于 stackoverflow 的 URL?

    我正在创建一个视频网站 我希望视频的直接网址看起来像 example com watch this is a slug 1 其中 1 是视频 ID 但我不想让蛞蝓变得重要 example com watch this is another
  • MVVM 独特的优势

    stackoverflow 搜索将导致多个包含相似标题的帖子 但这是不同的问题 由于这不是一个讨论网站 我必须问一个不同的问题 使用 MVVM 可以给我带来哪些其他实现无法带来的独特好处 MVC NTiers 或其他任何东西 我并不是真正在
  • C# 如何将 System.Net.ConnectStream 转换为 byte[] (数组)

    我正在尝试将流 System Net ConnectStream 转换为字节数组 关于如何做到这一点的任何想法 示例 Stream sourceStream the ConnectStream byte array using var ms
  • 如何在 REST Assured 中设置请求超时?

    我正在发送带有 REST Assured 的帖子请求 问题是它根本没有超时 就我而言 服务器有时无法访问 这会永远锁定请求 找到了答案 我将其发布在这里 希望对某人有所帮助 RestAssured config RestAssuredCon
  • 用颜色绘制 SKPhysicsBody 的形状

    使用 SpriteKit 创建游戏 效果非常好 我正在使用物理学并且能够看到我的身体实际上在哪里 因为我的精灵里面可能有一些阿尔法 这真的会很有帮助 这也将有助于创建更精确的身体 在 SpriteKit 的文档中 他们讨论了 debugOv
  • 如何将 .Net 日期时间转换为 T-SQL 日期时间

    MyDataSource SelectParameters startDate DefaultValue fromDate SelectedDate Date ToString 如您所见 我正在 Net SqlDataSource 中设置参
  • 从自定义中间件(外部身份提供商)重定向期间未传递登录 ID

    我们希望在身份服务器中有一个外部身份提供商 用户被重定向到登录到此外部身份提供商 Idp 并在那里完成身份验证 外部 Idp 将响应重定向回我们的身份服务器 我们希望在其中根据响应形成用户声明并重定向回调用客户端 我们遵循了答案这个计算器问
  • Oracle 多次更新查询

    我的数据库中有两张如下表所示的表 在每个 DEPARTMENT CODE 的第一个表 ITEM 中 将有多个 ITEM CODE ITEM STORE CODE ITEM CODE DEPARTMENT CODE 011 912003 14
  • 如何在 IntelliJ 中执行外部工具

    我在哪里可以实际启动 IntelliJ 中的外部工具 我知道在哪里设置外部工具 并且我已经完成了 但我看不到在哪里启动它 我没有从 运行 菜单中看到它 也没有从任何右键单击菜单中看到它 您可以使用 JetBrains 的命令行工具支持插件从
  • select/poll 与异步 I/O 的性能

    从性能角度来看 哪一个更好 选择 轮询还是异步 I O 我之前的印象是 select poll 反复向内核请求数据 而异步 I O 则依赖于内核通知数据可用性 但是 我注意到 select poll 也依赖于内核通知 因此 我相信从性能的角
  • 如何在Python中转义撇号等?

    我有一个带有这样的符号的字符串 39 这显然是一个撇号 我尝试了 saxutils unescape 但没有任何运气 并尝试了 urllib unquote 我怎样才能解码这个 谢谢 查看这个问题 https stackoverflow c
  • C#、XML、添加新节点

    我正在尝试向现有 XML 文件添加新节点 我有这个文件 其中包含第一个测试元素
  • 无法访问 Azure Functions 的管理 URL

    我正在使用 powershell 并尝试访问 Azure 函数行政使用 API 我正在尝试获取在 appName 下创建的所有函数的列表 当然 我在调用之前将 appName 更改为实际的 Azure 函数名称 在这次通话之前我也得到了有效
  • Office Dialog API 向子对话框发送消息

    我们希望使用 Dialog API 进行一些更适合更大工作区域的额外操作 我们已经能够通过 API 从对话框中向家长发送消息 Office context ui messageParent 但是我们还希望能够直接向对话框发送消息 例如sen
  • 切换主题后如何保留我的(自定义)IDE 配色方案?

    Delphi Rio comes with two color schemes dark and light I open Tools gt Options gt Editor gt Color and changed the dark c
  • 弹跳球。使其在高峰时减速

    我在 x3d 中创建了一个弹跳球动画 我只是好奇如何让球在其高度的峰值处减速 使其看起来更真实 先感谢您
  • Nodejs 中工作线程如何工作?

    Nodejs 不能像 java 和 net 那样有内置的线程 API 做 如果添加线程 语言本身的性质就会 改变 无法将线程添加为一组新的可用线程 类或函数 Nodejs 10 x 添加了工作线程作为实验 现在从 12 x 开始稳定 我浏览