Odi中不费吹灰之力的线程

介绍

多线程是同时执行两个或多个线程的过程。 大多数编程语言都提供了API,以方便使用线程和并行性。 开发人员可以专注于应用程序逻辑,而不是通信通道,同步或体系结构设置。

节点10.5添加了对 具有实验性标志的worker_threads模块。 但是从节点11.7开始,此功能是开箱即用的。 这是Node中多线程范例的良好起点。

worker_threads具有巨大的潜力,因此从早期开始就向worker_threads添加了对该模块的支持。 与往常一样,Odi的目标是提供方便,干净和简约的API(带有神奇的🧙‍♂️),以便开发人员可以专注于开发,而不是设置。

项目设置

在上一篇文章中,Odi获得了新的CLI命令,该命令可初始化项目,定义脚本并安装所有必需的依赖项。

odi init

当前,只有几种选择:

-j, --jsx-templating  add jsx templates
-d, --database add typeorm integration
结构体

默认情况下,该项目将具有以下结构。

根据模板类型,将在命令执行期间安装所有必需的依赖项。 同样,如果提供了-j标志,则views文件夹将添加到项目根目录中。

源文件

基本模板中有2个预定义的源文件。

包含基本index.ts配置的index.ts文件。 默认情况下,服务器端口设置为8080

还有带有简单控制器定义的home.controller.ts文件。

从Odi和开发开始就足够了。

剧本

目前,只有npm start脚本可用。 在下一发行版中,可以使用Mocha和Chai使用npm test命令。

只需运行以下命令

npm start

该脚本包括编译和实际运行,因此完成后,您可以轻松打开浏览器并检查http://localhost:8080 URL。

线程数

根据设计,Node是具有非阻塞I / O的单线程。 这种方法有很多优点和缺点。 主要优点是简单。 开发人员不需要关心线程操作,数据同步等。但是任何资源密集型任务都会阻塞事件循环。

辅助线程可以处理资源密集型操作,因此主线程始终可用。 这对于服务器端应用程序非常重要,因为任何阻止任务都将延迟新客户端请求的接受和处理。

任务

让我们创建一个资源密集型(阻塞)函数,用于基于随机值生成来获取答案( )。

在大多数情况下,数学运算会占用大量CPU,因此这是实现我们目标的一个很好的例子。 以200_000_000系数运行此功能200_000_000需要5秒钟才能执行。

封锁

如上所述,任何阻止操作都不允许其他任务执行完毕。

理解阻塞的最好方法是UI。 例如,让我们使用Ora库将简单的CLI加载程序添加到我们的应用程序中。

首先,我们需要安装它。

npm install ora @types/ora

并通过以下方式更改Controller方法。 触发处理程序时,加载程序将出现在终端中,并且将旋转直到我们的计算完成。 同样,将打印用于请求处理的时间。

让我们启动服务器并从浏览器中触发处理程序。

加载程序没有旋转,因为我们的计算阻止了该过程。 加载程序必须能够每80毫秒重新渲染一次帧,但不能这样做,因为事件循环被getAnswer调用阻塞了。

后果

假设我们在实际应用程序中有此代码。 处理程序将阻止接受和处理新的客户请求。 这将严重影响客户体验。 此类操作必须放在其他应用程序或其他线程中。

工人

Odi提供了方便的多线程API。 开发人员无需考虑任何类型的设置。

定义

在Odi应用程序和容器中定义Worker真的很容易。 与Service定义有一些相似之处。 让我们包装一下getAnswer函数。

定义仅需要Worker装饰器。 现在我们可以将其作为其他依赖项注入到控制器中。

注意,必须在工作方法调用之前添加await关键字,即使它不是异步的,因为线程之间的通信是以异步方式完成的。

就这样! The‍♂️该方法将在另一个线程中执行,结果将返回到主线程。

评论

现在,可以测试带有UI加载器的示例。

一切正常。 加载程序正在旋转,因为代码正在另一个线程中运行,因此UI可以重新渲染框架。

校验

为确保该方法在另一个线程中处理,只需以另一种方式更改getAnswer

有关线程的信息将直接在控制台中提供。

比较方式

正如您在上面看到的,工作设置和处理需要零配置。 不需要像官方示例中那样的事件发射器,事件处理程序,文件名等。 Odi关心初始化,消息传递,方法调用和错误处理。

局限性

除基本限制外,没有其他限制。 请记住,工作程序类似于另一个应用程序,因此无法在不同线程之间访问运行时实例。 另外,不能通过线程访问Dependency Injection容器,因此每个线程都将拥有自己的容器。

用例

基本上,工作线程可以用于以下方法:

  1. 后台任务和计划任务
  2. 资源密集型运营
  3. 基于队列的处理

这些方法可以轻松地进行改进并适合每个特定的需求,但是所有这些方法都可以提高性能并提高应用程序的灵活性。

更多

您可以在GitHub上检查Odi回购。

另外,还有关于Odi的另一篇有趣的文章。

谢谢阅读! 随时留下任何反馈,想法或问题。

如果您喜欢Odi,只需在GitHub上开始为我们提供支持。 🌟✨

继续阅读,更多有趣的东西将在下一次更新中发布! ♂️

From: https://hackernoon.com/odi-threads-8bb9c3c94f6a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值