nodejs 获取cpu核心数量_用 NodeJS 充分利用多核 CPU 的资源[每日前端夜话0xCB]

每日前端夜话0xCA

每日前端夜话,陪你聊前端。

每天晚上18:00准时推送。

正文共:1558 字

预计阅读时间:7 分钟

作者:Nick Major

翻译:疯狂的技术宅

来源:coderrocketfuel

1a84411cea762130ab7340d3786777f8.png

介绍

单个 Node.js 程序的实例仅在一个线程上运行,因此无法充分利用 CPU 的多核系统。有时你可能需要启动 Node.js 进程集群来利用本地计算机或生产服务器上的每个 CPU 内核。

在处理 API 或基于 ExpressJS 的HTTP服务器时,这个问题尤其重要。

幸运的是,Node.js 有一个名为 Cluster 的核心模块,它能够帮助我们在 CPU 的所有核心上运行 Node.js 程序。

在本文中,我们将会用 Node.js 实现一个 ExpressJS HTTP 服务器,并在每个 CPU 内核上创建一个唯一的实例。这样,由于每个其CPU 核心实例都会提供可能的并发请求数,因此 HTTP 服务器的吞吐量将会大大增加。

让我们开始吧!

目录

  • 创建 Express HTTP 服务器

  • 在多个 CPU 核心上运行服务器

创建 Express HTTP 服务器

我们要做的第一件事是启动并运行 HTTP 服务器。如果你已经有了一个可用的 ExpressJS 服务器,则可以跳至下一部分:在多核 CPU 上运行服务器。

我们将用 ExpressJS 来快速创建一个高效而简单的服务器。如果尚未安装 npm 软件包,则可以用以下命令进行安装:

1$ npm install --save express

然后把下面的代码添加到要你的的 Node.js 文件中:

1

首先,我们 require() 先前安装的 Express npm 软件包。

然后,我们创建一个 PORT 变量,该变量可以是当前的 process.env.PORT 的值,也可以是 5000。然后用express() 方法创建一个 express 实例,并将其保存在 app 变量中。

最添加 app.listen() 函数,用于启动 Express 程序,并告诉它侦听我们指定的 PORT

通过命令行运行代码时,应该看到类似的内容输出到控制台:

1Output:

很好!现在我们启动 Express HTTP 服务器。

在多个 CPU 核心上运行服务器

在本节中,我们会把 Express 服务器运行在 CPU 的多个核心上!

为了帮助我们实现这一目标,我们将使用Node.js模块 OS 和 Cluster 。用 OS 模块来检测系统有多少个 CPU 核,用 Cluster 模块来创建多个子进程,我们的 HTTP 服务器可以并行运行这些子进程。

由于这些是核心模块,因此不需要安装任何 npm 包,并且可以将它们 require()到我们的代码中。

我将为你提供完整的代码,并在随后进行解释,因此,如果你看得一头雾水,也没有关系。

这是完整的代码:

 1

代码中做了很多事情,所以让我们解释它的每一个部分。

首先是 require() express 包以及 Node.js 的两个核心模块 oscluster

接下来,创建一个  PORT  变量,并为其分配当前 process.env.PORT 编号或 5000 的值。我们稍后将在启动时用到它。

然后,我们创建一个名为 clusterWorkerSize 的变量来表示系统的 CPU 数量。可以用 os.cpus().length方法获得这个数字。查看 Node.js 文档来获取有关 os.cpus() 方法的更多信息。

我们创建一个了 if...else语句,用 clusterWorkerSize 值检查 CPU 是否有多个核。如果 CPU 数量大于 1,我们就继续创建集群。但是如果运行代码的计算机上只有一个 CPU 核心,则以本教程第一步中的方式启动 Express 程序。

假设我们的机器有多个 CPU 核心,那么就要创建另一个 if...else 语句,检查该语句是否为集群中已运行的第一个进程。用 cluster.isMaster() 方法检查是否返回 truefalse

如果是第一个运行的进程,我们将用 cluster.fork() 为计算机上的每个 CPU 核产生一个新的工作进程。我们还添加了一个事件侦听器,该侦听器将在工作进程退出时输出一条消息,以便我们知道何时出现问题或意外。

值得注意的是,主进程用于侦听 HTTP 服务器的端口,并在工作进程之间平衡所有请求的负载。

产生所有工作进程后,我们将在创建的每个工作进程上创建一个程序的新实例。如果你的计算机有 2 个 CPU 核,则将会创建该程序的 2 个实例。

运行程序时,应该能够在控制台上看到以下内容:

1Output:

输出将根据 CPU 核的数量而有所不同。

现在你有了一个能够在多核 CPU 上运行的 HTTP 服务器!

结论

cluster 模块使我们能够轻松创建子进程,从而为 Node.js 提供了使用 CPU 所提供的全部功能所急需的功能。并且它还在后台为在主进程和工作进程之间进行通信做了大量工作。

在读完本文之后,你现在应该知道该如何使用这个模块在多个 CPU 核心上运行 Express HTTP 服务器。有了这些知识,你将能够更好地管理和扩展你的应用。

原文:https://coderrocketfuel.com/article/run-a-node-js-http-express-js-server-on-multiple-cpu-cores

 f0a8125a4822b8f5334f6ddb188d9129.gif

下面夹杂一些私货:也许你和高薪之间只差这一张图

2019年京程一灯课程体系上新,这是我们第一次将全部课程列表对外开放。

愿你有个好前程,愿你月薪30K。我们是认真的 !559d0fefd20cd9659b442a10d0938122.png

328122ff150a337a56a08546cec34cd8.png

在公众号内回复“体系”查看高清大图

长按二维码,加大鹏老师微信好友

拉你加入前端技术交流群

唠一唠怎样才能拿高薪

c3320309418a260e81a04801a0fe840e.png

c3b37d45132a7de91c39c2dfd4c277ab.gif

 往期精选 

  • BootstrapVue 入门

  • JavaScript的工作原理:引擎、运行时和调用堆栈

  • 用 TypeScript 开发 Node.js 程序

  • 快速上手最新的 Vue CLI 3

  • JavaScript 程序员可以从C ++中学到些什么

  • 在同一基准下对前端框架进行比较

  • Edge 拥抱 Chromium 对前端工程师意味着什么?

  • 使你的 JavaScript 代码简单易读

  • Node.js多线程完全指南

  • deno如何偿还Node.js的十大技术债

  • 实战!半小时写一个脑力小游戏

  • CSS Flexbox 可视化手册

  • 世界顶级公司的前端面试都问些什么

  • V8引擎内部机制及优化代码的5个技巧

小手一抖,资料全有。长按二维码关注前端先锋,技术文章和业界动态。

f7322dd8c4bcb46870fce74bbd8fd24e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员面试金典 - 面试题 16.20. T9键盘(数组)

1. 题目 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。 每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。 你会得到一张含有有效单词的列表。映射如下图所示: 示…

胃部不适,原来好辛苦!

这几天胃部都感觉不舒服,那种感觉很难形容,总之就非常辛苦,无胃口,浑身都不舒服,可能是之前几天早餐没吃饱,有几天很晚才入睡空着肚子的缘故吧,原来胃部不适是如此辛苦的,怕怕&#…

重磅!顶级一区期刊官宣:明年起将不再拒稿!

源 | 青塔学术、量子位等颠覆科学出版的“游戏规则”?10月20日,国际著名生物学综合期刊eLife官方宣布了一个重大决定:从2023年1月31日起,所有经过同行评审的文章,eLife都不会作出接受/拒绝的决定,而是直接发布在其网站…

EM(期望极大化)算法及其推广

文章目录1. EM算法2. EM算法收敛3. EM算法应用4. EM算法的推广5. sklearn.mixture.GaussianMixture概率模型有时既有观测变量(observable variable),又有隐变量或潜在变量(latent variable)如果概率模型的变量都是观测…

GridView 中添加删除确认提示框

在GridView中我们可以直接添加一个CommandField删除列来删除某行信息。但为了避免误操作引起的误删除&#xff0c;在删除操作者让操作者再确认下&#xff0c;完后再进行删除。 首先我们给我们的GridView 添加一个模板列&#xff0c;如下&#xff1a; <asp:TemplateField He…

终于有人喊出来:论文一稿多投是作者的合法权利!

文 | 马建平&#xff0c;三峡大学学报编辑源 | 现代出版一稿多投目前已演变为许多作者一种常态化的投稿方式。针对一稿多投现象&#xff0c;舆论似乎是一边倒的反对和谴责之声&#xff0c;认为它浪费了极为稀缺的出版资源&#xff0c;扰乱了报刊社正常的出版秩序&#xff0c;是…

python中pop用法_Python dict pop()用法及代码示例

Python语言为几乎所有容器(无论是列表容器还是集合容器)指定了pop()。这篇特别的文章着重说明Python词典提供的pop()方法。这种方法对于经常处理字典的程序员很有用。 用法&#xff1a;dict.pop(key, def) 参数&#xff1a; key:必须返回并删除其键值对的键。 def:如果指定的键…

桩训日记

2007年2月7日 弄了一天的模拟练习&#xff0c;挺累的&#xff0c;明天估计是练习 起步停车2007年2月8日 上午起步停车&#xff08;年龄挺大的李教练&#xff09;&#xff0c;临近中午开始倒库&#xff08;挺帅的尹教练&#xff09;&#xff0c;下午继续倒库&#xff0c;基本茫然…

LeetCode 912. 排序数组(10种排序)

文章目录1. 题目2. 解题2.1 插入排序2.2 冒泡排序2.3 选择排序2.4 希尔排序2.5 归并排序2.6 快速排序2.7 堆排序2.8 计数排序2.9 桶排序2.10 基数排序3. 复杂度表1. 题目 给你一个整数数组 nums&#xff0c;将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,…

顶会审稿人谈论文中稿“潜规则”

科研论文&#xff0c;不同于毕业论文之处在于——科研论文是根据有价值的生产实践或科研课题写作的&#xff0c;具有原创性和独到性的论文。在学术界&#xff0c;有人写论文是为了升硕士&#xff0c;升博士或者研究生博士顺利毕业。毕竟在学术界论文是工作和科研水平的直观体现…

python asyncio_如何使用Python中的asyncio?

【51CTO.com快译】Python的异步编程功能(简称async)让你可以编写不必等待独立任务完成就可以完成更多工作的程序。Python附带的asyncio库为你提供了使用async处理磁盘或网络I/O、无需其他方面等待的工具。 asyncio提供了两种处理异步操作的API&#xff1a;高级和低级。高级API用…

程序员面试金典 - 面试题 08.05. 递归乘法(位运算)

1. 题目 递归乘法。 写一个递归函数&#xff0c;不使用 * 运算符&#xff0c; 实现两个正整数的相乘。 可以使用加号、减号、位移&#xff0c;但要吝啬一些。 示例1:输入&#xff1a;A 1, B 10输出&#xff1a;10示例2:输入&#xff1a;A 3, B 4输出&#xff1a;12提示: …

最新整理完成

终于把主站做完了&#xff0c;用了一个小型的cms系统&#xff0c;因为买不起asp.net的空间&#xff0c;而且因为买的时候没问清楚&#xff0c;后来才知道限制cpu4%以内&#xff0c;才知道频繁的server unavaliable是多么的痛苦。我现在把修正后的新闻系统重新提供下载&#xff…

PromptCLUE:大规模多任务Prompt预训练中文开源模型

简介PromptCLUE&#xff1a;大规模多任务Prompt预训练中文开源模型。中文上的三大统一&#xff1a;统一模型框架&#xff0c;统一任务形式&#xff0c;统一应用方式。支持几十个不同类型的任务&#xff0c;具有较好的零样本学习能力和少样本学习能力。针对理解类任务&#xff0…

JS基础知识总结

前几天在网上看到的一个总结&#xff0c;觉得挺好的&#xff0c;所以记录了下来&#xff0c;以备查用。1 创建脚本块 1: <script language”JavaScript”>2: JavaScript code goes here3: </script> 2 隐藏脚本代码 1: <script language”JavaScript”>2: &…

程序员面试金典 - 面试题 10.02. 变位词组(哈希map)

1. 题目 编写一种方法&#xff0c;对字符串数组进行排序&#xff0c;将所有变位词组合在一起。 变位词是指字母相同&#xff0c;但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"]…

python3.7安装wordcloud_Python中的wordcloud库安装问题及解决方法

今天下载wordcloud的时候出现了很多问题&#xff0c;在此总结总结 1.问题一&#xff1a;You are using pip version 19.0.3, however version 20.0.2 is available…问题解决方法&#xff1a; 打开cmd输入如下命令 python -m pip install -U pip 2.问题二&#xff1a;error: Mi…

互联网最值得加入的173家国企汇总

文 | 重庆搬砖喵、王二源 | 知乎今年的就业形势&#xff0c;实在是严峻。社招都这样&#xff0c;更别说应届生。虽然有一些垃圾国企&#xff0c;但仍然有非常多值得考虑的国企&#xff0c;毕竟优质的国企很稳定&#xff0c;不会像互联网一样担忧年纪大被裁员的情况发生&#xf…

LeetCode 1111. 有效括号的嵌套深度(奇偶分离)

1. 题目 有效括号字符串 仅由 "(" 和 ")" 构成&#xff0c;并符合下述几个条件之一&#xff1a; 空字符串连接&#xff0c;可以记作 AB&#xff08;A 与 B 连接&#xff09;&#xff0c;其中 A 和 B 都是有效括号字符串嵌套&#xff0c;可以记作 (A)&…