Web 工作线程
工作线程是唯一一种在主线程之外运行 JavaScript 的方式。这对于各种各样的程序来说非常有用,尤其是在需要进行大量计算而又不阻塞线程的程序中。
首先,我们将定义一个 Web 工作线程,它可以接收来自主线程的消息,并根据这些消息进行一些处理。
./worker.ts
self.onmessage = async (e) => {
const { filename } = e.data;
const text = await Deno.readTextFile(filename);
console.log(text);
self.close();
};
目前,Deno 只支持模块类型的 worker。为了实例化一个,我们可以使用类似于 Web 上的语法。
./main.ts
const worker = new Worker(
new URL("./worker.ts", import.meta.url).href,
{
type: "module",
},
);
我们可以使用 `postMessage` 方法向工作线程发送消息。
./main.ts
worker.postMessage({ filename: "./log.txt" });
默认情况下,工作线程会继承它被实例化线程的权限。我们可以使用 deno.permissions 选项为工作线程授予某些权限。
./main.ts
const worker2 = new Worker(
new URL("./worker.ts", import.meta.url).href,
{
type: "module",
deno: {
permissions: {
read: [
new URL("./file_1.txt", import.meta.url),
new URL("./file_2.txt", import.meta.url),
],
},
},
},
);
由于我们使用特定权限实例化了这个工作线程,这将导致工作线程尝试读取它没有访问权限的文件,因此会抛出权限错误。
./main.ts
worker2.postMessage({ filename: "./log.txt" });