将CPU密集型任务卸入到节点.js中的工人线程,使用一个统一的API的网页浏览器和电子.
在浏览器中使用网络工人, worker_threads 在节点12+和 tiny-worker 在节点8到11.
特征
- 对 aync 函数 打开 观测
- 写代码一次,运行它 在所有平台上
- 管理大宗任务的执行 线程池
- 使用 要求( ) 财务报告和审定财务报表 导入编号 :导出 在工人当中
- 不错 网络软件包
0.x 版本数
你可以找到旧版本的0.12线程.js v0 分支。本页面的所有内容都指1.0版本,该版本是用全新的API重写库.
安装
npm install threads tiny-worker
您只需要安装 tiny-worker 用于支持节点.js < 12的软件包 这是一种可选的依赖,如果 worker_threads 无法获取.
平台支持
在节点上运行( J)
使用线程运行代码. js在节点中工作在框外.
请注意,我们包 本地 Worker这样 new Worker("./foo/bar") 将解析相对于调用它的模块的路径,而不是相对于当前工作目录.
将密码与网络包装或包裹捆绑起来时的行为一致.
Webpack 建立设置
网络包配置
与 threads-plugin它将透明地检测所有 new Worker("./unbundled-path") 表达式,将工人代码捆绑并替换 new Worker(...) 路径与工人捆绑路径,所以你不需要明确使用 worker-loader 或定义额外的切入点.
npm install -D threads-plugin
那就加进你的 webpack.config.js数字 :
+ const ThreadsPlugin = require('threads-plugin');
module.exports = {
// ...
plugins: [
+ new ThreadsPlugin()
]
// ...
}
节点.js捆绑
如果您正在使用 Webpack 创建将运行在节点的捆绑( Webpack 配置) target: "node"),您还需要指定 tiny-worker 用于节点 < 12的软件包不应捆绑:
module.exports = {
// ...
+ externals: {
+ "tiny-worker": "tiny-worker"
+ }
// ...
}
一定要保证 tiny-worker 列在您的 package.json dependencies 在这样的情况下.
使用类型脚本时
注:您需要使用Typescript版本4+,因为由线程所生成的类型.js不支持Typescript 3.
确保 TypeScript 编译器保留 import 编号 : export 语句完好无损,所以网包可以解决. 否则 threads-plugin 将无法完成它的工作.
module.exports = {
// ...
module: {
rules: [
{
test: /\.ts$/,
loader: "ts-loader",
+ options: {
+ compilerOptions: {
+ module: "esnext"
+ }
+ }
}
]
},
// ...
}
Parcel 捆绑器设置
您需要导入 threads/register 在您的应用代码开头( 在主代码中, 而不是在工人中) :
import { spawn } from "threads"
+ import "threads/register"
// ...
const work = await spawn(new Worker("./worker"))
这个是图书馆的 Worker 作为全球平台的 Worker。这是必要的,因为你不能 import { Worker } from "threads" 否则帕塞尔就认不出 new Worker() 作为网络工人了.
要知道,这可能会影响到任何试图对普通网络工人进行即时攻击的代码 Worker 而现在却瞬间将一线接通. 编 Worker线条.js Worker 但这种糖可能对第三方图书馆产生意外的副作用.
其他一切皆应取出.
开始
基本情况
// 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)
}
})
产卵( )
这个 hashPassword() 函数 auth 主代码中的对象代表调用 hashPassword() 劳动者中的职能:
如果工人的函数返回一个承诺或一个可观察到的,那么您可以在主代码中像这样使用返回值. 如果函数返回了原始值,则期望主函数返回一个解决该值的许诺.
曝光()
使用 expose() 使包含方法的函数或对象可以从主线程调用.
在暴露物体的情况下, spawn() 将同步返回显示所有对象功能的天体。 狦 expose() 函数, spawn 也返回一个可调用函数,而不是对象.
使用量
查找关于 网站数字 :
网络软件包
Threads.js工作与网络包装. 通常你要做的就是添加
threads-plugin。 。 。 .
见 用网页包构建 详情请访问网站.
调试
我们正在使用 debug 选项包以提供选入调试日志。 所有软件包的调试消息都有一个范围,首先是 threads:,带有不同的子镜:
threads:master:messagesthreads:master:spawnthreads:master:thread-utilsthreads:pool:${poolName || poolID}
准备吧 DEBUG=threads:* 启用所有库的调试日志。 例如,通过完全调试记录进行测试:
DEBUG=threads:* npm test
许可证
麻省理工学院