3
A
回答
3
SharedWorker
构造函数在WorkerGlobalScope
中当前不可用,因此您将无法像在iframe或窗口中那样构造实例。
您可以做的是,为每位员工创建一个MessageChannel,并使用它在worker和sharedWorker之间进行通信。虽然这样做会抵消对实际SharedWorker
的需求,因为您可以改为使用单个Worker
。
例子:
var numWorkers = 4;
var sharedWorker = new Worker("worker-shared.js");
for(var i = 0; i < numWorkers; i++) {
var dedicatedWorker = new Worker("worker-dedicated.js");
var channel = new MessageChannel();
dedicatedWorker.postMessage({sharedWorkerPort: channel.port1}, [channel.port1]);
sharedWorker.postMessage({workerPort: channel.port2}, [channel.port2]);
}
5
您可以在https://stackoverflow.com/a/30796101/1319998使用类似的技术。对于每个专用工作者,您可以创建一个共享工作者对象,指向相同的脚本,并将其端口传递给专用工作者。
请注意,对于相同的脚本URL,new SharedWorker(scriptUrl)
不一定会创建一个新的共享工作线程:它只是创建一个新对象,允许您与共享工作线程通信,并且只创建线程本身已经不存在了。
作为示例,以下内容会创建2个Worker
对象,每个对象创建一个单独的专用工作线程和2个对象,总共创建一个共享工作线程。共享工人的端口对象传递到专用工:然后
var sharedWorkerA = new SharedWorker("worker-shared.js");
sharedWorkerA.port.start();
var dedicatedWorkerA = new Worker("worker-dedicated.js");
dedicatedWorkerA.postMessage({sharedWorkerPort: sharedWorkerA.port, workerName: 'A'}, [sharedWorkerA.port]);
var sharedWorkerB = new SharedWorker("worker-shared.js");
sharedWorkerB.port.start();
var dedicatedWorkerB = new Worker("worker-dedicated.js");
dedicatedWorkerB.postMessage({sharedWorkerPort: sharedWorkerB.port, workerName: 'B'}, [sharedWorkerB.port]);
专用的工作人员可以在他们收到的端口对象发布消息:
self.onmessage = function(e) {
var workerName = e.data.workerName;
var sharedWorkerPort = e.data.sharedWorkerPort;
self.setInterval(function() {
sharedWorkerPort.postMessage('sent from dedicated worker ' + workerName);
}, 2000);
};
而共享的工人可以接受其中:
var num = 0;
self.onconnect = function(e) {
console.log('shared connect');
var port = e.ports[0];
port.onmessage = function(e) {
num++;
console.log('Received in shared worker: ', e.data);
console.log('Number of messaged received:', num);
};
};
我已经把一些额外的代码在那里只是为了证明确实是有一个实际的共享工作线程运行。你可以看到上面的工作在http://plnkr.co/edit/RcxxY2EDIcclUegC82wG?p=preview
相关问题
- 1. 从网络共享运行(本地)Azure工作者角色
- 2. 网络工作者代表(子工作者)不工作
- 3. 角网络工作者不工作
- 4. ble.scan()frow网络工作者
- 5. importScripts(网络工作者)
- 6. 网络工作者不起作用
- 7. 离子2中的网络工作者和网络工作者2
- 8. Rails,Heroku,Unicorn&Resque - 如何选择网络工作者/ resque工作者的数量?
- 9. 网络工作者不与onclick
- 10. fHighcharts同构渲染/网络工作者
- 11. 终止一个网络工作者
- 12. Android GPS网络提供者不工作
- 13. 网络工作者的限制
- 14. 识别网络工作者的环境?
- 15. SVN网络共享工作副本
- 16. 什么是共享工作者?工人与共享工人有什么不同?
- 17. 使用网络工作者调用页面方法
- 18. 线程如何帮助使用网络工作者?
- 19. 从工作者角色访问AzureFileStorage共享?
- 20. 从网络工作者发布数据后引用
- 21. 如何访问网络工作者中的变量?
- 22. 如何在npm中要求()网络工作者?
- 23. 网络工作者不产卵子的工人在Firefox 10
- 24. 显示网络工作者制作的xhr的进度
- 25. Facebook的共享者在移动设备不工作
- 26. 使用网络工作者执行异步任务JavaScript
- 27. 使用网络工作者与煎茶触摸2
- 28. 使用承诺为网络工作者终极版
- 29. 网络中使用工作者的角度服务
- 30. 工作表共享
可能重复的[在专用工作者中产生共享工作者](http://stackoverflow.com/questions/30741686/spawning-a-shared-worker-in-a-dedicated - 工作人员) –
@MichalCharemza不适用于多个专职工作人员,因为'port'对象只能传送一次。 – levi
对于每个专用工作者,您可以创建一个“新的SharedWorker”,并将端口对象传递给它。但是,我发现您正在寻找的答案与http://stackoverflow.com/a/30796101/1319998有点不同。删除我的近距离投票... –