node JS獲取GPS_Node.js 12.0.0 的一个小故事

407c54a4fbcd9f556c7efc9bb43ffb76.png

前几天 Node.js 12.0.0 发布了,网上也有很多文章介绍这个版本的新的特性,例如 https://www.yuque.com/egg/nodejs/nodejs-12,不过今天我想要介绍的是另外一个小故事。

我们在公司内部使用 Node.js 的时候,遇到了一个困扰我们很久的问题,Node.js 进程的 CPU 使用率经常会达到 100%,很多产品线都会遇到,而且问题复现非常困难,偶尔复现之后,进入到容器用过 strace 来查看系统调用,发现 epoll_ctl 和 epoll_pwait 这两个系统调用占用大部分CPU时间,虽然问题经常出现,但是是偶发性的,所以之前并没有花费太多的精力去追查。然后突然某一天,线上所有的 Node.js 服务在同一时刻,都出现了这个问题,所以解决这个问题刻不容缓。

在 oyyd 和 yeyuanfeng 排查了很久之后,最终由 yeyuanfeng 同学帮忙把这个问题搞定了,整个问题的追查过程非常精彩,但是版权属于 yeyuanfeng 同学,我这里就不放出来了。相关的 Issue 和 Pull Request 大家可以参考:

CPU Usage 100% · Issue #2162 · libuv/libuv​github.com
c0f8b57dcfd7532a254b16758f61542b.png
unix: fix epoll cpu 100% issue by tsyeyuanfeng · Pull Request #2166 · libuv/libuv​github.com
c0f8b57dcfd7532a254b16758f61542b.png

目前发布的 Node.js 12.0.0 里面已经包含了这次的改动,相关的 Commit 地址是:https://github.com/nodejs/node/commit/0109e121d3a2f87c4bad75ac05436b56c9fd3407

---

PS: 前几天跟 @Rokid 的同学 @Yorkie 交流的时候,这个 Patch 刚好也解决了他们的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 `electron-builder` 来打包 Electron 应用,并将 Node.js 服务一起打包进去。 以下是一个使用 Node.js 官方镜像打包一个 Express 服务的示例: 1. 首先,安装 `electron-builder`: ```bash npm install electron-builder --save-dev ``` 2. 然后,在项目根目录下创建一个 `build` 目录,并在其中创建一个 `index.js` 文件,用于启动 Express 服务: ```javascript const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(3000, () => { console.log('Example app listening on port 3000!') }) ``` 3. 在项目根目录下创建一个 `package.json` 文件,用于配置打包相关信息: ```json { "name": "electron-express", "version": "1.0.0", "main": "main.js", "scripts": { "start": "electron .", "build": "electron-builder" }, "dependencies": { "electron": "^12.0.0", "express": "^4.17.1" }, "devDependencies": { "electron-builder": "^22.10.5" }, "build": { "appId": "com.example.electron-express", "productName": "Electron Express", "directories": { "output": "dist" }, "files": [ "build/**/*", "package.json" ], "extraResources": [ { "from": "node_modules/express/**/*", "to": "app/node_modules/express" } ], "mac": { "category": "public.app-category.developer-tools", "target": { "target": "default", "arch": [ "x64" ] } }, "win": { "target": { "target": "nsis", "arch": [ "x64" ] } } } } ``` 在 `package.json` 文件中,我们指定了 `express` 和 `electron-builder` 作为依赖项,并将 `build` 目录中的文件和 `package.json` 文件包含在打包文件中。我们还使用 `extraResources` 属性将 `express` 模块包含在 Electron 应用程序中。 4. 最后,在项目根目录下创建一个 `main.js` 文件,用于启动 Electron 应用程序和 Node.js 服务: ```javascript const { app, BrowserWindow } = require('electron') const path = require('path') const url = require('url') let mainWindow function createWindow() { mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }) mainWindow.loadURL('http://localhost:3000') mainWindow.on('closed', function () { mainWindow = null }) } app.on('ready', createWindow) app.on('window-all-closed', function () { if (process.platform !== 'darwin') { app.quit() } }) app.on('activate', function () { if (mainWindow === null) { createWindow() } }) const express = require('./build/index') express() ``` 这个文件启动 Electron 应用程序并加载 `http://localhost:3000` 这个 URL,在应用程序启动后会自动开始运行 `index.js` 文件中定义的 Express 服务。 5. 最后,在命令行中执行 `npm run build` 命令,即可将 Electron 应用程序和 Node.js 服务一起打包为可执行文件。 打包完成后,在 `dist` 目录下可以找到打包好的可执行文件。运行该文件即可启动 Electron 应用程序并访问 Express 服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值