多线程 Worker
说明
简介
一些异步处理的任务,可以放置于 Worker 线程中运行,待运行结束后,再把结果返回到小程序主线程。
Worker 线程运行于一个单独的全局上下文与线程中,会全局暴露一个 worker 对象。
注意事项
- 1.Worker 最大并发数量限制为 1 个,创建下一个前请用 Worker.terminate() 结束当前
Worker
。- 2.Worker 内代码只能 require 配置的
Worker
路径内的文件,无法引用其它路径文件。- 3.Worker 内不支持
tt
系列的 API。- 4.Worker 内不支持
globalThis
、window
,返回值均为 null
。- 5.Worker 线程内支持
console
能力,目前仅支持 info
、log
、debug
、warn
、error
。- 6.自基础库 3.5.0.0 开始,可以在 Worker 中使用 TTWebAssembly 相关能力。
- 7.自基础库 3.45.0.0 开始,可以在 worker 中使用定时器相关 API:setTimeout、clearTimeout、setInterval、clearInterval。
使用方法
第一步:配置 Worker 信息
假设使用 Worker 的小程序,目录结构如下:
├── app.js ├── app.json ├── app.ttss ├── project.config.json ├── pages │ └── index ├── workers │ ├── request │ │ ├── index.js │ │ └── utils.js │ └── response │ └── index.js
开发者通过在 app.json workers 字段声明 Worker 代码放置的位置,支持配置为 Worker 代码放置的目录或单个 Worker 文件,配置路径下的所有 JS/TS 代码最终将被打包成一个 JS 文件。
配置 Worker 代码放置的目录:
{ "workers": "workers" }
配置单个 Worker 代码文件:
{ "workers": "workers/response/index.js" }
第二步:编写 Worker 代码
在 Worker 文件中编写 Worker 响应代码。Worker 运行于一个单独的全局上下文与线程中,会全局暴露一个 worker 对象,所以在 Worker 文件中直接调用
worker.onMessage/worker.postMessage
即可。// workers/response/index.js worker.onMessage(function (res) { console.log(res); }); worker.postMessage("Worker 线程收到消息");
第三步:在主线程中初始化 Worker
在主线程的代码中初始化 Worker。
const worker = tt.createWorker("workers/response/index.js"); // 文件名指定 worker 的入口文件路径,必须是绝对路径
第四步:主线程向 Worker 线程发送消息
主线程初始化 Worker 后,可以向 Worker 线程发送消息通信。
worker.postMessage({ msg: "hello worker", });