Skip to content

多進程Worker

一些非同步處理的任務,可以放置於Worker中運行,待運行結束後,再把結果返回到小程序主線程。 Worker運行於一個單獨的全域上下文與線程中,不能直接調用主線程的方法。

Worker與主線程之間的資料傳輸,雙方使用 Worker.postMessage() 來發送數據, Worker.onMessage() 來接收數據,傳輸的數據並不是直接共亯,而是被複製的。

使用流程

配置Worker資訊

在app.json中可配置Worker代碼放置的目錄,目錄下的所有JS代碼最終將被打包成一個JS文件:

配置示例:

js
{
  "workers": "workers"
}

通過以上管道配置,workers目錄下的所有JS文件會被打包為一個JS文件,並作為小程序首包的一部分。

添加Worker代碼文件

根據步驟1中的配置,在代碼目錄下新建以下兩個入口文件:

js
workers/request/index.js
workers/request/utils.js
workers/response/index.js

添加後,目錄結構如下:

js
├── app.js
├── app.json
├── project.config.json
└── workers
    ├── request
    │   ├── index.js
    │   └── utils.js
    └── response
        └── index.js

編寫Worker代碼

在workers/request/index.js編寫Worker響應代碼

js
const utils = require('./utils')

// In the worker thread execution context, a worker object is globally exposed and can be directly called by worker.onMessage/postMessage.
worker.onMessage(function (res) {
  console.log(res)
})

在主線程中初始化Worker

在主線程的代碼app.js中初始化Worker

js
const worker = wx.createWorker('workers/request/index.js') // The filename specifies the worker entry file path as an absolute path.

主線程向Worker發送消息

js
worker.postMessage({
  msg: 'hello worker'
})

注意事項

  • Worker最大併發數量限制為1個,創建下一個前請用 Worker.terminate() 結束當前Worker
  • Worker內代碼只能require指定Worker路徑內的文件,無法引用其它路徑;
  • Worker的入口文件由 wx.createWorker() 時指定,開發者可動態指定Worker入口文件;
  • Worker內不支持wx系列的API;
  • Workers之間不支持發送消息;
  • Worker目錄內只支持放置JS文件,其他類型的靜態文件需要放在Worker目錄外。