javascript - self.close 真的会杀死网络工作线程吗?

标签 javascript multithreading web-worker

请参阅此示例:

// CLOSEWORKER.JS:

self.postMessage('foo');
self.close();
self.postMessage('bar');
setTimeout(() => self.postMessage('baz'), 0);

// MAIN.JS:

const worker = new Worker('./worker.js');
worker.onmessage = ({data}) => console.log(data);

即使我调用了 self.close(),下一行 self.postMessage('bar'); 仍然执行并记录 'bar'。我可以不明白,因为 close 方法应该在被调用后立即终止工作线程。

此外,请参阅另一个示例:

TERMINATEWORKER.JS:

self.onmessage = ({data}) => console.log(data);

MAIN.JS:

const worker = new Worker('./worker.js');
setTimeout(() => {
 worker.postMessage('foo');
 worker.terminate();
 worker.postMessage('bar');
 setTimeout(() => worker.postMessage('baz'), 0);
}, 1000)

当使用terminate方法而不是close方法时,代码按照我的预期执行。它只记录“foo”,不记录任何其他内容,这表明线程在调用 terminate 方法后立即被终止。

最佳答案

WorkerGlobalScope.close()调用时会丢弃已计划的所有任务并设置 closing WorkerGlobalScope 的标志,有效防止任何新任务排队。

但是,它不会停止当前任务的执行。

事实上,在您的第一个示例中,它将运行当前脚本直到结束,并仍然执行 self.postMessage('bar') 操作,您的主线程将能够处理.

Worker.terminate()另一方面也会“中断当前在工作线程中运行的脚本。”

关于javascript - self.close 真的会杀死网络工作线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67564331/

相关文章:

python - 使用弹性 beantalk 运行后台作业

reactjs - 在 React/Webpack 应用程序中将节点模块导入到 Web Worker

javascript - 为什么这个关闭有效?

javascript - 当我们从下拉菜单中选择一个选项时动态添加输入类型

c - pthread_join 不起作用

multithreading - Python 类管道流对象

c - 二维数组指针

javascript - emscripten webworker 的最小工作示例

javascript - JQuery 问题 "TypeError: $.getJSON is not a function"

javascript - AJAX 中的方法参数是否需要大写?