介绍
多线程是同时执行两个或多个线程的过程。 大多数编程语言都提供了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容器,因此每个线程都将拥有自己的容器。
用例
基本上,工作线程可以用于以下方法:
- 后台任务和计划任务
- 资源密集型运营
- 基于队列的处理
这些方法可以轻松地进行改进并适合每个特定的需求,但是所有这些方法都可以提高性能并提高应用程序的灵活性。
更多
您可以在GitHub上检查Odi回购。
另外,还有关于Odi的另一篇有趣的文章。
谢谢阅读! 随时留下任何反馈,想法或问题。
如果您喜欢Odi,只需在GitHub上开始为我们提供支持。 🌟✨
继续阅读,更多有趣的东西将在下一次更新中发布! ♂️