Chrome 中的嵌套 Web Worker
Nested Web Worker in Chrome
我正在尝试使用 Chrome 从 Web Worker 内部启动 Web Worker。从历史上看,这一直是 space Chrome 主机 API 的问题,但是:
根据ChromeStatus,截至 2018-10-22
Dedicated workers can create nested workers, but shared workers and service workers cannot.
Creating a nested dedicated worker from a shared worker is not yet supported.
Nested shared workers are also in the spec, but there is no plan to support them at this time.
幸运的我;我正在使用专门的工作人员。
我找不到任何可用信息与 Chrome 中桌面版本 69(我使用的是 Chrome 72)的支持声明正式矛盾,我的嵌套 Worker 只是坐在他的笨蛋上拒绝给珍妮丝买咖啡。
我有三个活动部件在起作用:SlaveDriver、Minion 和 Peon。 SlaveDriver 委托给 Minion。 Minion 委托给 Peon,Peon 做工作,每个接收者都拿走功劳。
SlaveDriver
(
function(){
var minion = new Worker('./Features/Work/Work.Minion.js');
let crackTheWhip= ()=>
{
let message = {ID: 1};
minion.postMessage(
JSON.stringify(message)
);
console.log(message.ID);
};
let take_the_credit = (message)=>
{
let work = JSON.parse(message.data);
console.log("Hot Coffee!");
console.log(JSON.stringify(work));
};
minion.onmessage = take_the_credit;
return {
GetJaniceHerCoffee: crackTheWhip
};
})();
小黄人./Features/Work/Work.Minion.js
(
function(){
var self = this;
var peon = new Worker('./Features/Work/Work.Peon.js');
let receiveWorkOrder = (message)=>
{
console.log('Delegating to a Peon');
peon.postMessage(
message.data
);
};
let take_the_credit = (message)=>
{
console.log('Taking the credit');
let work = JSON.parse(message.data);
self.postMessage(JSON.stringify(
work
));
};
peon.onmessage = take_the_credit;
self.onmessage = receiveWorkOrder;
}
)();
苦工./Features/Work/Work.Peon.js
(
function(){
var self = this;
let receiveWorkOrder = (message)=>
{
console.log("surfing LinkedIn.");
console.log("surfing Whosebug");
console.log("...wth is this? *sigh*");
let work_result = {Value: "Coffee"};
self.postMessage(JSON.stringify(
work_result
));
};
self.onmessage = receiveWorkOrder;
}
)();
如果我停止委派给 minion 并让他做 peon 的所有工作,一切都会进行得很好。但是,一旦我尝试让 minion 委托给 peon,它就会对我产生影响。在 DevTools 中,当我向它发送消息时,我可以在我的线程列表中看到 minion 激活。我的调试上下文跳转到工作线程,当我将消息发送到 peon 时,Peon 线程被添加到 Threads 列表中,但所有传播似乎都停止了。控制台的日志不会发生。调试上下文不会跳转到 Peon 线程。我的 minion 的 take_the_credit
回调没有收到响应。
苦工只是坐在那儿不做他的工作。
为什么我的工人拒绝给珍妮丝送咖啡?
我的问题的答案目前可以在关于使用 Web Workers
的 MDN 文档的 Spawning Subworkers 小节中找到
Workers may spawn more workers if they wish. So-called sub-workers must be hosted within the same origin as the parent page. Also, the URIs for subworkers are resolved relative to the parent worker's location rather than that of the owning page. This makes it easier for workers to keep track of where their dependencies are.
最终,我遇到的问题的根源在于,当我的 minion worker 试图生成它的 peon 时,它试图引用一个与文档根目录相关的文件,而不是来自 worker 上下文的文件但是控制台没有任何输出表明该文件不存在。
为了配合这个简单的例子:
奴隶司机
<script type="application/javascript">
var slave_driver = (
function(){
let minion = new Worker('/Features/Work/minion.js');
let crackTheWhip = ()=>
{
minion.postMessage(
JSON.stringify({SERVICE: "get"})
);
};
let take_the_credit = (message)=>
{
console.log("It's about time");
alert(message.data);
};
minion.onmessage = take_the_credit;
return {
GetJaniceHerCoffee: crackTheWhip
}
}
)();
slave_driver.GetJaniceHerCoffee();
</script>
小黄人 ./Features/Work/Work.Minion.js
(
function(){
var self = this;
let home = location;
let peon = new Worker('/peon.js');
let receiveWorkOrder = (message)=>
{
console.log("Delegating to a Peon");
peon.postMessage(
message.data
);
}
let take_the_credit = (message)=>
{
console.log("It's about time!");
console.log("Minion Taking the Credit");
let work = JSON.parse(message.data);
self.postMessage(JSON.stringify(work));
};
peon.onmessage = take_the_credit;
self.onmessage = receiveWorkOrder;
}
)();
苦工 ./Features/Work/Work.Peon.js
(
function(){
var self = this;
let receiveWorkOrder = (message)=>
{
console.log("Peon surfing Whosebug");
console.log("Peon surfing ebay for beanie babies, cuz they're coming back, yo");
console.log("...wth is this? *sigh*");
let work_result = {Value: "Coffee"};
self.postMessage(JSON.stringify(
work_result
));
};
self.onmessage = receiveWorkOrder;
})();
请注意小兵生成苦工时对文件引用所做的微小更改。
如果您将 "slavedriver" 脚本放入 index.html 文件的正文中,并将相关模块放入其标识的位置,您应该会在打开 index.[=17 时收到显示 {"Value":"Coffee"}
的警报=]
我正在尝试使用 Chrome 从 Web Worker 内部启动 Web Worker。从历史上看,这一直是 space Chrome 主机 API 的问题,但是:
根据ChromeStatus,截至 2018-10-22
Dedicated workers can create nested workers, but shared workers and service workers cannot.
Creating a nested dedicated worker from a shared worker is not yet supported.
Nested shared workers are also in the spec, but there is no plan to support them at this time.
幸运的我;我正在使用专门的工作人员。
我找不到任何可用信息与 Chrome 中桌面版本 69(我使用的是 Chrome 72)的支持声明正式矛盾,我的嵌套 Worker 只是坐在他的笨蛋上拒绝给珍妮丝买咖啡。
我有三个活动部件在起作用:SlaveDriver、Minion 和 Peon。 SlaveDriver 委托给 Minion。 Minion 委托给 Peon,Peon 做工作,每个接收者都拿走功劳。
SlaveDriver
(
function(){
var minion = new Worker('./Features/Work/Work.Minion.js');
let crackTheWhip= ()=>
{
let message = {ID: 1};
minion.postMessage(
JSON.stringify(message)
);
console.log(message.ID);
};
let take_the_credit = (message)=>
{
let work = JSON.parse(message.data);
console.log("Hot Coffee!");
console.log(JSON.stringify(work));
};
minion.onmessage = take_the_credit;
return {
GetJaniceHerCoffee: crackTheWhip
};
})();
小黄人./Features/Work/Work.Minion.js
(
function(){
var self = this;
var peon = new Worker('./Features/Work/Work.Peon.js');
let receiveWorkOrder = (message)=>
{
console.log('Delegating to a Peon');
peon.postMessage(
message.data
);
};
let take_the_credit = (message)=>
{
console.log('Taking the credit');
let work = JSON.parse(message.data);
self.postMessage(JSON.stringify(
work
));
};
peon.onmessage = take_the_credit;
self.onmessage = receiveWorkOrder;
}
)();
苦工./Features/Work/Work.Peon.js
(
function(){
var self = this;
let receiveWorkOrder = (message)=>
{
console.log("surfing LinkedIn.");
console.log("surfing Whosebug");
console.log("...wth is this? *sigh*");
let work_result = {Value: "Coffee"};
self.postMessage(JSON.stringify(
work_result
));
};
self.onmessage = receiveWorkOrder;
}
)();
如果我停止委派给 minion 并让他做 peon 的所有工作,一切都会进行得很好。但是,一旦我尝试让 minion 委托给 peon,它就会对我产生影响。在 DevTools 中,当我向它发送消息时,我可以在我的线程列表中看到 minion 激活。我的调试上下文跳转到工作线程,当我将消息发送到 peon 时,Peon 线程被添加到 Threads 列表中,但所有传播似乎都停止了。控制台的日志不会发生。调试上下文不会跳转到 Peon 线程。我的 minion 的 take_the_credit
回调没有收到响应。
苦工只是坐在那儿不做他的工作。
为什么我的工人拒绝给珍妮丝送咖啡?
我的问题的答案目前可以在关于使用 Web Workers
的 MDN 文档的 Spawning Subworkers 小节中找到Workers may spawn more workers if they wish. So-called sub-workers must be hosted within the same origin as the parent page. Also, the URIs for subworkers are resolved relative to the parent worker's location rather than that of the owning page. This makes it easier for workers to keep track of where their dependencies are.
最终,我遇到的问题的根源在于,当我的 minion worker 试图生成它的 peon 时,它试图引用一个与文档根目录相关的文件,而不是来自 worker 上下文的文件但是控制台没有任何输出表明该文件不存在。
为了配合这个简单的例子:
奴隶司机
<script type="application/javascript">
var slave_driver = (
function(){
let minion = new Worker('/Features/Work/minion.js');
let crackTheWhip = ()=>
{
minion.postMessage(
JSON.stringify({SERVICE: "get"})
);
};
let take_the_credit = (message)=>
{
console.log("It's about time");
alert(message.data);
};
minion.onmessage = take_the_credit;
return {
GetJaniceHerCoffee: crackTheWhip
}
}
)();
slave_driver.GetJaniceHerCoffee();
</script>
小黄人 ./Features/Work/Work.Minion.js
(
function(){
var self = this;
let home = location;
let peon = new Worker('/peon.js');
let receiveWorkOrder = (message)=>
{
console.log("Delegating to a Peon");
peon.postMessage(
message.data
);
}
let take_the_credit = (message)=>
{
console.log("It's about time!");
console.log("Minion Taking the Credit");
let work = JSON.parse(message.data);
self.postMessage(JSON.stringify(work));
};
peon.onmessage = take_the_credit;
self.onmessage = receiveWorkOrder;
}
)();
苦工 ./Features/Work/Work.Peon.js
(
function(){
var self = this;
let receiveWorkOrder = (message)=>
{
console.log("Peon surfing Whosebug");
console.log("Peon surfing ebay for beanie babies, cuz they're coming back, yo");
console.log("...wth is this? *sigh*");
let work_result = {Value: "Coffee"};
self.postMessage(JSON.stringify(
work_result
));
};
self.onmessage = receiveWorkOrder;
})();
请注意小兵生成苦工时对文件引用所做的微小更改。
如果您将 "slavedriver" 脚本放入 index.html 文件的正文中,并将相关模块放入其标识的位置,您应该会在打开 index.[=17 时收到显示 {"Value":"Coffee"}
的警报=]