poolifier nodejs 线程池工具
nodejs 也有一个线程池的实现worker_threads,但是属于静态配置的,实际很多使用我们需要的是动态的,poolifier 是一个很不错的实现
使用简单,灵活支持固定线程是以及动态线程池,以下是一个简单的学习使用(注意node 版本需要12.x 以及以上版本)
项目准备
- 项目结构
├── README.md
├── package.json
├── src
│ ├── index.js
│ └── myworker.js
└── yarn.lock
- 代码说明
package.json node 依赖以及npm script 定义
{
"name": "node-thread-pool",
"version": "1.0.0",
"main": "src/index.js",
"license": "MIT",
"dependencies": {
"poolifier": "^1.0.0"
},
"scripts": {
"start": "node src/index.js",
"test:standard":"standard",
"test:standard-fix":"standard --fix"
},
"devDependencies": {
"standard": "^14.3.1"
}
}
src/index.js node 应用入口
'use strict'
// fix (node:2381) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 26 error listeners added. Use emitter.setMaxListeners() to increase limit
require('events').EventEmitter.defaultMaxListeners = 30
const { FixedThreadPool, DynamicThreadPool } = require('poolifier')
// a fixed thread pool
const pool = new FixedThreadPool(15,
'./src/myWorker.js',
{ errorHandler: (e) => console.error(e), onlineHandler: () => console.log('worker1 is online') })
// or a dynamic thread pool
const pool2 = new DynamicThreadPool(10, 100,
'./src/myWorker.js',
{ errorHandler: (e) => console.error(e), onlineHandler: () => console.log('worker2 is online') })
pool2.emitter.on('FullPool', () => console.log('Pool is full'))
// the execute method signature is the same for both implementations,
// so you can easy switch from one to another
pool.execute({ username: 'dalong', userage: 333 }).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
pool2.execute({ username: 'dalong2', userage: 555 }).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
src/myworker.js worker 代码定义
'use strict'
const { ThreadWorker } = require('poolifier')
function myFunction (data) {
return { ok: 1, data }
}
module.exports = new ThreadWorker(myFunction, { maxInactiveTime: 60000 })
启动&& 效果
- 启动
yarn start
- 效果
yarn start
yarn run v1.21.1
$ node src/index.js
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker1 is online
worker2 is online
worker2 is online
worker2 is online
worker2 is online
worker2 is online
worker2 is online
worker2 is online
worker2 is online
worker2 is online
worker2 is online
{ ok: 1, data: { username: 'dalong', userage: 333 } }
{ ok: 1, data: { username: 'dalong2', userage: 555 } }
说明
poolifier 简化了基于nodejs worker_threads 开发多线程应用的成本,使用简单,灵活
参考资料
https://nodejs.org/api/worker_threads.html#worker_threads_worker_threads
https://github.com/pioardi/poolifier
https://github.com/rongfengliang/node-thread-pool-learning
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-01-25 openresty 集成 sentry 异常系统
2019-01-25 quicklink 基本使用
2019-01-25 pnpm 快速节省磁盘工具的包管理工具
2019-01-25 Load Balancing OpenSSH SFTP with HAProxy
2016-01-25 Centos配置国内yum源
2016-01-25 ubutntu apt 源
2016-01-25 docker 使用redis