Skip to content

介绍

ChildPoolJob基于node.js子进程实现。可以创建一批进程常驻内存,传递任务后直接执行,没有创建、销毁进程的性能开销,延迟低。

注意:node.js子进程中无法使用所有涉及electron的api(electron技术本身无法支持),相关业务请写在主进程

目录

./electron/jobs

使用方法

  1. 编写任务代码 同 ChildJob 示例 查看

  2. 触发任务

javascript
# ./electron/service/example.js

# 引入模块
const { ChildPoolJob } = require('ee-core/jobs');

/**
 * 示例服务(service层为单例)
 * @class
 */
class ExampleService extends Service {

  constructor(ctx) {
    super(ctx);

    // 在构造函数中初始化一些变量
    this.myJobPool = new ChildPoolJob();
  }

  /**
   * 创建pool
   */ 
  doCreatePool(num, event) {
    const channel = 'controller/framework/createPoolNotice';
    this.myJobPool.create(num).then(pids => {
      event.reply(`${channel}`, pids);
    });
  }

  /**
   * 通过进程池执行任务
   */ 
  doJobByPool(jobId, action, event) {
    let res = {};
    const channel = 'controller/framework/timerJobProgress';
    if (action == 'run') {
      // 异步-执行任务及监听进度
      this.myJobPool.runPromise('./jobs/example/timer', {jobId}).then(task => {

        // 监听器名称唯一,否则会出现重复监听。
        // 任务完成时,需要移除监听器,防止内存泄漏
        let eventName = 'job-timer-progress-' + jobId;
        task.emitter.on(eventName, (data) => {
          logger.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;
  }
}

ExampleService.toString = () => '[class ExampleService]';
module.exports = ExampleService;