jobs/ChildPoolJob
ee-core:v2.1.0
# 介绍
ChildPoolJob基于node.js子进程实现。可以创建一批进程常驻内存,传递任务后直接执行,没有创建、销毁进程的性能开销。
# 使用方法
const { ChildPoolJob } = require('ee-core/jobs');
const pool = new ChildPoolJob();
# API列表
# pool.children
类属性,返回通过run() / runPromise() 创建的实例对象集合。
# pool.max
类属性,最大进程数
# pool.strategy
类属性,进程选举算法,默认 'polling' 轮询
# pool.weights
类属性,权重
# pool.LB
类属性,负载均衡器
# pool.create(number = 3)
- number [Int] - 要创建的进程数量
创建一个池子,返回 pids
pool.create(3).then(pids => {
// ...
});
# pool.run(filepath, params = {})
- filepath [String] - ./jobs 目录的相对路径;或者绝对路径。
- params [Object] - 传递的参数
从进程池中选举出一个进程,然后执行一个job文件。
# ./electron/service/example.js
const timerTask = pool.run('./jobs/example/timer', {jobId});
# pool.runPromise(filepath, params = {})
run()的异步语法
# 示例文件
# ./electron/service/example.js
/**
* 通过进程池执行任务
*/
doJobByPool(jobId, action, event) {
let res = {};
const channel = 'controller.example.timerJobProgress';
if (action == 'run') {
// 异步-执行任务及监听进度
pool.runPromise('./jobs/example/timer', {jobId}).then(task => {
// 监听器名称唯一,否则会出现重复监听。
// 任务完成时,需要移除监听器,防止内存泄漏
let eventName = 'job-timer-progress-' + jobId;
task.emitter.on(eventName, (data) => {
Log.info('[main-process] [ChildPoolJob] timerTask, from TimerJob data:', data);
// 发送数据到渲染进程
event.sender.send(`${channel}`, data)
// 如果收到任务完成的消息,移除监听器
if (data.end) {
task.emitter.removeAllListeners(eventName);
}
});
res.pid = task.pid;
});
}
return res;
}
# pool.getPids()
获取当前pids数组。
# pool.getChildByPid(pid)
- pid [Int]
通过pid获取一个子进程对象
# pool.killAll()
关闭所有进程。
# EventEmitter
ChildPoolJob继承于events模块,因此实例化后的对象,可以使用EventEmitter所有方法
# ForkProcess
通过run() / runPromise() 返回的进程对象。
const myProc = pool.run('./jobs/example/timer', {jobId});
# or
pool.runPromise('./jobs/example/timer', {jobId}).then(myProc => {
let eventName = 'job-timer-progress-' + jobId;
myProc.emitter.on(eventName, (data) => {
// ...
})
});
# myProc.emitter
实例化后的EventEmitter (opens new window)模块对象。
- 方法列表:
emitter.addListener(eventName, listener)
emitter.emit(eventName[, ...args])
emitter.eventNames()
emitter.getMaxListeners()
emitter.listenerCount(eventName)
emitter.listeners(eventName)
emitter.off(eventName, listener)
emitter.on(eventName, listener)
emitter.once(eventName, listener)
emitter.prependListener(eventName, listener)
emitter.prependOnceListener(eventName, listener)
emitter.removeAllListeners([eventName])
emitter.removeListener(eventName, listener)
emitter.setMaxListeners(n)
emitter.rawListeners(eventName)
emitter[Symbol.for('nodejs.rejection')](err, eventName[, ...args])
- 使用
pool.runPromise('./jobs/example/timer', {jobId}).then(myProc => {
let eventName = 'job-timer-progress-' + jobId;
myProc.emitter.on(eventName, (data) => {
// ...
})
});
# myProc.child
通过child_process (opens new window)模块,fork (opens new window)出来的进程对象。
# myProc.pid
子进程pid
# myProc.dispatch(cmd, jobPath = '', params = {})
分发任务
# myProc.kill()
- timeout [Int] - 默认 1000ms
kill子进程
# myProc.sleep()
sleep(仅Unix平台)
# myProc.wakeup()
wakeup (仅Unix平台)
上次更新: 2025/03/27, 02:12:08