JS多线程之threads.js

3,831 阅读1分钟

参考

threads.js usage

个人理解

搬一个npm的示例过来

// master.js
import { spawn, Thread, Worker } from "threads"
 
const auth = await spawn(new Worker("./workers/auth"))
const hashed = await auth.hashPassword("Super secret password", "1234")
 
console.log("Hashed password:", hashed)
 
await Thread.terminate(auth)
// workers/auth.js
import sha256 from "js-sha256"
import { expose } from "threads/worker"
 
expose({
  hashPassword(password, salt) {
    return sha256(password + salt)
  }
})
  • spawn() 创建一个worker进程
  • expose() 声明你希望提供给主线程调用的函数
  • Thread.terminate() 终止进程

理解:

就上面简单的例子来说,master.js就是主线程执行代码,这样写的话,在主线程等待worker线程的时候也不能继续执行,依然是个同步执行的效果。

那我们实际用的时候,把master.js封装成一个异步函数,在调用的时候不需要await,这个时候主线程可以直接去做自己想做的事情。

Thread.terminate() 是在主线程终止worker线程,如果在执行terminate前页面刷新或者跳转了,这个worker线程会继续占用系统资源,如果在重新进入这个页面的话,会再创建另一个worker进程来抢占计算机资源。 所以如果选择在主线程中终止worker线程的话,记得在componentWillUnmount的生命周期里终止worker线程。(除非跨组件和页面的特殊需要)