多线程 Worker

收藏
我的收藏
说明
如果要使用多线程 Worker,请确保:
    基础库为 2.78.0 及以上版本。
    开发者工具为 4.0.3 及以上版本,可点击下载

简介

一些异步处理的任务,可以放置于 Worker 线程中运行,待运行结束后,再把结果返回到小程序主线程。
Worker 线程运行于一个单独的全局上下文与线程中,会全局暴露一个 worker 对象。
Worker 线程与主线程之间的数据传输,双方使用 Worker.postMessage() 来发送数据,Worker.onMessage() 来接收数据,传输的数据并不是直接共享,而是被复制的。

注意事项

    1.Worker 最大并发数量限制为 1 个,创建下一个前请用 Worker.terminate() 结束当前 Worker
    2.Worker 内代码只能 require 配置的 Worker 路径内的文件,无法引用其它路径文件。
    3.Worker 内不支持tt系列的 API。
    4.Worker 内不支持globalThiswindow,返回值均为 null
    5.Worker 线程内支持 console 能力,目前仅支持 infologdebugwarnerror
    6.自基础库 3.5.0.0 开始,可以在 Worker 中使用 TTWebAssembly 相关能力。
    7.自基础库 3.45.0.0 开始,可以在 worker 中使用定时器相关 API:setTimeoutclearTimeoutsetIntervalclearInterval

使用方法

第一步:配置 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", });
Worker 对象的其它接口请参考 Worker 接口说明