0

0

为什么 Elixir 在异步处理方面比 Nodejs 更好?

WBOY

WBOY

发布时间:2024-08-31 09:12:06

|

1115人浏览过

|

来源于dev.to

转载

为什么 elixir 在异步处理方面比 nodejs 更好?

简单答案:Node.js 是单线程的,并拆分该单线程来模拟并发,而 Elixir 利用 Erlang 虚拟机 BEAM 的原生并发和并行性来同时运行进程。

下面,我们将更深入地理解这种差异,探索两个关键概念:Node.js 事件循环和 Elixir 的 BEAM VM 和 OTP。这些元素对于理解每种技术如何处理执行异步任务以及这如何影响不同应用程序中的性能和可扩展性至关重要。

1.什么是事件循环?

Node.js 在单个主线程上运行,并使用称为事件循环的机制来管理异步操作。基本概念是它检查待处理的待处理任务,例如 I/O 操作、promise 和 callbacls,并在它们准备好时执行它们。

1.1 实践中如何运作:

当发起异步操作时(例如对 API 的查询),它会被委托给 libuv。同时,事件循环继续接受其他连接。
当异步操作完成时,libuv 将结果返回到事件队列,然后事件循环将与该操作关联的回调放在调用堆栈上。

1.2 事件循环的局限性:

  • 如果调用堆栈上存在耗时或 CPU 密集型任务,它可能会阻塞其他操作的处理,从而降低效率。

  • 并发性受到限制,因为所有内容都在单个主线程上运行。

2.BEAM VM 和 OTP

Elixir 构建于 BEAM VM 之上,该虚拟机为 Erlang 提供支持,以其处理高并发性和弹性的能力而闻名。与 Node.js 不同,Elixir 不依赖于单个线程。相反,它使用由 BEAM 管理的极其轻量级且隔离的进程。

2.1 实践中如何运作:

  • Elixir 中的每个进程都是独立的,这意味着它们不共享内存,也不会互相阻塞。
  • 这些进程由 BEAM 管理,BEAM 可以同时创建和管理数百万个进程,在所有可用的 CPU 核心之间分配负载。
  • 此外,Elixir 还附带 OTP(开放电信平台),它提供了一组用于构建强大的分布式系统的库和工具。

2.2 BEAM和OTP的优点:

  • 可扩展性:BEAM 可以将进程分布在所有 CPU 核心上,从而最大限度地提高资源利用率。
  • 弹性:如果一个进程失败,不会影响其他进程。这允许您构建容错系统。
  • 真正的竞争:与仅限于单个线程的事件循环不同,Elixir 可以利用多个 CPU 核心真正并行运行进程。

3. Node.js 和 Elixir 的实践比较

让我们想象一台服务器需要处理数千个同时连接,每个连接都执行异步操作和一些繁重且耗时的处理。

3.1 使用 Node.js:

  • 服务器在某种程度上是高效的,但随着大量操作的堆积,事件循环开始变得过载。尽管充分利用 JSNode 中可用的资源可以对性能有很大帮助:例如正确使用 async/wait 和/或 then/catch 以及内置资源例如lib节点:集群
  • 这可能会导致响应新连接的延迟,从而对性能造成重大影响。

3.2 使用 Elixir:

  • 每个连接都可以由单独的进程管理。 I/O 操作、计算甚至故障都可以隔离管理。
  • BEAM 有效地分配负载,确保系统即使在高需求下也能继续运行而不会出现重大问题。
  • 如果需要,可以通过消息在进程之间进行通信。
  • BEAM 抢占式调度引擎。

结论

Node.js 对于许多应用程序来说都是一个出色的工具,特别是那些处理简单异步操作并且不需要大量 CPU 处理的应用程序。然而,其基于单线程的并发模型在更复杂的场景中可能会成为瓶颈。

Elixir 具有 BEAM VM 以及对轻量级进程和大规模并发的本机支持,为需要处理大量并发操作并在多个 CPU 线程之间分配负载的系统提供了强大且高效的替代方案。如果您需要弹性、可扩展性和高并发,Elixir 是您的选择。

虽然本文的标题大胆地表明 Elixir 和 BEAM 在异步处理方面优于 Node.js,但重要的是要认识到这些技术之间存在显着差异。决定使用哪一种必须考虑多种因素,而不仅仅是这里讨论的并发性和并行性。生态系统、团队对语言的熟悉程度、具体项目要求以及要执行的任务的性质等方面在选择最适合工作的工具时发挥着至关重要的作用。毕竟每个场景都有其特殊性,技术的选择必须从全局的角度考虑,考虑到项目的所有需求和挑战。

参考书目

主题:

线程是程序中最小的执行单元。在许多操作系统上,一个进程可以包含多个线程,每个线程执行程序的不同部分。线程可以共享内存和资源,但这可能会导致并发问题,例如竞争条件。

竞赛:

并发是系统同时处理多个任务的能力。在并发系统中,多个任务即使不同时运行也可以独立进行。例如,BEAM 管理独立运行的竞争流程。

事件循环:

事件循环是 Node.js 等系统中用于管理异步操作的设计模式。它工作在单线程中,循环执行任务,响应I/O和异步执行等事件,保证程序在等待长时间操作的同时继续响应。

md2card
md2card

Markdown转知识卡片

下载
并行度:

并行是指在不同的CPU核心上同时执行多个任务。与指并发任务的管理的并发不同,并行涉及实​​际上同时执行这些任务。 BEAM 将进程分布在多个核心上以最大限度地提高并行性。

轻量级流程:

在 BEAM 中,轻量级进程是比传统线程具有更高内存和 CPU 效率的执行单元。它们彼此隔离并由 BEAM 管理,这允许您创建和管理数百万个并发进程。

抢占式调度:

抢占式调度是一种运行时管理系统,操作系统或虚拟机为每个进程分配时间片,确保没有进程独占CPU。在 BEAM,这确保了所有流程都有机会公平执行。

光束虚拟机:

BEAM(Bogdan/Björn 的 Erlang Abstract Machine)是运行 Erlang 和 Elixir 代码的虚拟机。它以高效管理轻量级流程、支持大规模并发和并行以及提供容错能力而闻名。

OTP(开放电信平台):

OTP 是 Erlang 和 Elixir 附带的一组库和设计模式。它提供了构建并发、分布式和容错系统的工具,有助于开发健壮且可扩展的应用程序。

利布夫

是一个跨平台库,为 Node.js 中的异步 I/O 操作提供支持。它负责实现事件循环并抽象操作系统功能,例如网络操作、文件系统和线程。 libuv 允许 Node.js 在单线程中高效执行异步任务,利用内部线程池进行阻塞操作,确保主事件循环的连续性。

输入/输出操作

I/O(输入/输出)操作是指程序与外部世界之间的任何交互,例如读取或写入文件、与硬件设备通信或通过网络交换数据。这些操作可能非常耗时,并且在许多系统上都是异步执行的,以防止程序在等待操作完成时发生阻塞。

参考

二郎。简短的 BEAM 底漆。 Erlang 博客,2020。可访问:https://www.erlang.org/blog/a-brief-beam-primer/。访问日期:8 月 29 日2024 年。

二郎。 Erlang 入门 [PDF]。 Erlang.org。网址为:https://erlang.org/download/erlang-book-part1.pdf。访问日期:8 月 29 日2024 年。

节点医生。 Node.js 事件循环的动画指南。 Dev.to,2021 年。可访问:https://dev.to/nodedoctors/an-animated-guide-to-nodejs-event-loop-3g62。访问日期:8 月 29 日2024 年。

节点医生。动画 Node.js 事件循环阶段。 Dev.to,2022 年。可访问:https://dev.to/nodedoctors/animated-nodejs-event-loop-phases-1mcp。访问日期:8 月 29 日2024 年。

NODE.JS。簇。 Node.js,2023。可在:https://nodejs.org/api/cluster.html 获取。访问日期:8 月 29 日2024 年。

相关专题

更多
erlang语言是什么
erlang语言是什么

erlang是一种并发、容错、分布式和动态类型的编程语言。它专门用于构建并发系统,并提供了一个轻量级进程模型来实现并发性。想了解更多erlang的相关内容,可以阅读本专题下面的文章。

392

2024.06.19

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

324

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

231

2023.10.07

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

608

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

646

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

466

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2886

2023.08.11

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

61

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
快速入门Node.JS全套完整版
快速入门Node.JS全套完整版

共83课时 | 8.3万人学习

nodejs开发基础教程
nodejs开发基础教程

共15课时 | 4.5万人学习

JavaScript设计模式视频教程
JavaScript设计模式视频教程

共28课时 | 5.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号