首页 > 其他分享 >使用线程池和窗口池优化electron

使用线程池和窗口池优化electron

时间:2023-04-03 12:55:34浏览次数:34  
标签:index task 窗口 win worker electron 线程 const

概念

窗口池和线程池是两个不同的概念。

窗口池是指在Electron中同时创建多个窗口,并对这些窗口进行管理和维护的机制。窗口池可以帮助开发者更好地管理和控制应用中的窗口,从而提高应用的性能和稳定性。在窗口池中,可以对窗口进行创建、销毁、隐藏、显示等操作,以满足不同的应用场景和需求。

线程池是指在Electron主进程中使用Node.js提供的线程池模块worker_threads来实现多线程处理的机制。线程池可以将一些耗时的计算、IO等操作分配到多个线程中进行处理,从而不会阻塞主线程,保证应用的流畅性和稳定性。在线程池中,可以对线程进行创建、销毁、调度等操作,以满足不同的应用场景和需求。

实现

线程池的实现

const { Worker } = require('worker_threads');

// 创建线程池
const workerPool = {
  size: 4, // 线程池大小
  workers: [],
  activeWorkers: 0,
  taskQueue: [],
  init() {
    for (let i = 0; i < this.size; i++) {
      const worker = new Worker('./worker.js');
      worker.on('message', this.handleMessage.bind(this));
      worker.on('error', this.handleError.bind(this));
      worker.on('exit', this.handleExit.bind(this));
      this.workers.push(worker);
    }
  },
  handleMessage(msg) {
    // 处理返回结果
    const { task, result } = msg;
    task.callback(result);
    this.activeWorkers--;
    this.schedule();
  },
  handleError(err) {
    // 处理错误信息
    console.error(err);
    this.activeWorkers--;
    this.schedule();
  },
  handleExit(worker) {
    // 处理退出线程
    console.log(`worker ${worker.threadId} exited`);
    this.activeWorkers--;
    this.schedule();
  },
  schedule() {
    // 调度任务
    while (this.taskQueue.length > 0 && this.activeWorkers < this.size) {
      const task = this.taskQueue.shift();
      this.dispatch(task);
    }
  },
  dispatch(task) {
    // 分配任务给空闲线程
    const worker = this.workers.shift();
    worker.postMessage(task);
    this.activeWorkers++;
    this.workers.push(worker);
  },
  addTask(task) {
    // 添加任务到任务队列
    this.taskQueue.push(task);
    this.schedule();
  },
};

// 创建任务
function taskFactory(data, callback) {
  return {data, callback, }
}

// 将任务添加到线程池 
function runTask(data, callback) { 
const task = taskFactory(data, callback)
 workerPool.addTask(task)
}

// 初始化线程池 
workerPool.init()

// 在主线程中创建任务并提交到线程池处理 
runTask({ num: 1000000 }, result => { console.log(result); });

 窗口池实现

const { BrowserWindow } = require('electron');

class WindowPool {
  constructor(options) {
    this.options = options || {};
    this.pool = [];
    this.index = 0;
  }

  createWindow() {
    const win = new BrowserWindow(this.options);
    this.pool.push(win);
    return win;
  }

  destroyWindow(win) {
    const index = this.pool.indexOf(win);
    if (index !== -1) {
      this.pool.splice(index, 1);
      win.destroy();
    }
  }

  hideWindow(win) {
    if (win && !win.isDestroyed()) {
      win.hide();
    }
  }

  showWindow(win) {
    if (win && !win.isDestroyed()) {
      win.show();
    }
  }

  nextWindow() {
    if (this.pool.length === 0) {
      return null;
    }
    this.index = (this.index + 1) % this.pool.length;
    return this.pool[this.index];
  }
}

 

标签:index,task,窗口,win,worker,electron,线程,const
From: https://www.cnblogs.com/Acicap/p/17282760.html

相关文章

  • 30.查看锁等待相关的阻塞线程、被阻塞线程信息及相关用户、IP、PORT
    SELECTlocked_table,locked_index,locked_type,blocking_pid,concat(T2.USER,'@',T2.HOST)AS"blocking(user@ip:port)",blocking_lock_mode,blocking_trx_rows_modified,waiting_pid,......
  • Python 多线程死循环挂服务器时CPU占用过高问题
    我的某个程序里有这样一段代码,把程序挂在服务器爬取信息,因此用到死循环,同时又需要进行三个任务,于是使用了多线程。刚开始在死循环部分并没有加time.sleep(60),于是它一直在for循环,同时会进行.is_alive()(不确定这个消耗大不大),但总之这使得CPU占用过高。而加上sleep之后,直接就降下......
  • VC6 在win11下运行出现 LINK : fatal error LNK1168: cannot open Debug/test.exe for
    写在前面vc6下载地址:https://softdown01.rbread04.cn/down/VC6.0green.rar?timestamp=6429444b&auth_key=e4fc373a1342be9ce2d6802419980ade注意:如果是win11则记得修改msdev名字修改兼容性和管理员运行才行 问题:最近用vc6学习逆向的时候出现的,记录下,方便查阅:LINK:fatal......
  • Java实现新建三个线程,每个线程顺序打印5个数字,打印到100
    方法一:synchronized+wait+notify//三个线程循环打印数字,每个打印5个,打印数字到numclassWaitNotifyABC{  privatevolatileintnum=0;//线程共享变量  /**Object和this都可以对同步代码块加锁,但是this锁的是类的实例,如果该实例被他人拿走,  则本线......
  • 请编写一个程序,使用两个线程分别输出数字和字母,要求输出的结果为:1A2B3C4D5E6F7G8H9I10
    请编写一个程序,使用两个线程分别输出数字和字母,要求输出的结果为:1A2B3C4D5E6F7G8H9I10J。提示:可以使用Java中的wait()和notify()方法来实现线程间的通信。 publicclassNumberLetterPrinter{//定义一个静态的锁对象privatestaticfinalObjectlock=newObje......
  • Golang 需要至少 5 个操作系统线程
    Golang需要至少5个操作系统线程主线程:Golang代码执行的入口点,负责初始化程序,并启动其他Goroutine。垃圾回收器线程:Golang内置了垃圾回收器,使用专门的线程来执行垃圾回收操作,回收不再使用的内存空间。CPU核心数个系统线程:每个核心需要一个系统线程来支持并发任务的执行......
  • 线程相关
    个人理解,如有错误,请海涵多任务调度大部分操作系统如Linux、Windos等,都是采用时间片轮转的抢占式调度方式来实现任务调度的。在这种调度方式下,每个进程执行一个任务都会在一短时间后暂停执行,切换其他进程执行任务。由于进程的上下文切换,CPU需要耗费大量的时间来保存该进程的内存......
  • Windows窗口对象
         ......
  • NonBlocking 非阻塞IO 状态下的实现单线程协程socket通信
    #服务器端#-*-coding:utf-8-*-importtimefromsocketimport*server=socket(AF_INET,SOCK_STREAM)server.bind(('127.0.0.1',8081))server.listen(5)server.setblocking(False)#至关重要的一步!!!conn_l=[]print('waiting...')whileTrue:......
  • 3.窗口函数
    语法:select排序函数/聚合函数over(<partitionby...>分区字段orderby排序字段)   #说明:注意over后面有一个空格说明:partitonby是可选的。如果不使用partitionby,那么就是将整张表作为一个集合,最后使用排序函数得到的就是每一条记录根据排序列的排序......