electron-egg electron-egg
首页
  • v4.x
  • v3.x
  • v2.x
插件
  • v4.x
  • v3.x
demo
支持
知识点
案例
交流
  • GitHub (opens new window)
  • Gitee (opens new window)
首页
  • v4.x
  • v3.x
  • v2.x
插件
  • v4.x
  • v3.x
demo
支持
知识点
案例
交流
  • GitHub (opens new window)
  • Gitee (opens new window)
❤️成为赞助商
  • 教程

  • ee-bin

  • ee-core

    • addon

      • 插件模块
      • window
    • bin
    • config
    • const
    • const/channel
    • controller
    • core
    • cross
    • ee
    • electron
    • electron/app
    • electron/window
    • exception
    • httpclient
    • jobs
    • jobs/ChildJob
    • jobs/ChildPoolJob
      • loader
      • log
      • message
      • message/childMessage
      • ps
      • services
      • socket
      • storage
      • storage/jsondb
      • storage/sqlite
      • tools
      • this-app

      • utils
      • utils/helper
      • utils/is
      • utils/json
      • utils/time
      • utils/ip
      • utils/get-port
      • oldUtils
    • ee-go

    • api
    • ee-core
    哆啦好梦
    2023-06-21
    目录

    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/06/06, 07:21:49
    jobs/ChildJob
    loader

    ← jobs/ChildJob loader→

    Theme by Vdoing | Copyright © 2023-2025 哆啦好梦 | 京ICP备15041380号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×