介绍
多线程是同时执行两个或多个线程的过程。 大多数编程语言都提供了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上开始为我们提供支持。 ????✨
继续阅读,更多有趣的东西将在下一次更新中发布! ♂️