Skip to content

Instantly share code, notes, and snippets.

@uupaa
Last active August 29, 2015 14:22
Show Gist options
  • Select an option

  • Save uupaa/5c581e66f3a632449256 to your computer and use it in GitHub Desktop.

Select an option

Save uupaa/5c581e66f3a632449256 to your computer and use it in GitHub Desktop.
MessageChannel 考察

uupaa/Thread.js は、WebWorker に MessageChannel を使っていたが、実は不要なんじゃないか説があり、実際のところを調べた。

結論を先に言えば不要だった。

window.onmessage は闇を抱えており、それは「あらゆるコンテキストからメッセージが onmessage に流れ込み、どのコンテキストからのメッセージなのか判別ができなくなる」というものだ。MessageChannel はそれを解決する優れた手段である。

2つ以上のコンテキストが存在する場所とは、具体的には以下となる。

  • メインページ(window) 上の別の空間
  • iframe と window 間の通信
  • SharedWorker 内の通信
  • 上記の混在
<!DOCTYPE html><html><head><title>Thread test</title>
<meta name="viewport" content="width=device-width, user-scalable=no">
<meta charset="utf-8"></head><body>
<script src="no.msgch.js"></script>
</body></html>
var worker1 = new Worker("no.msgch.worker1.js");
var worker2 = new Worker("no.msgch.worker2.js");
var worker3 = new Worker("no.msgch.worker3.js");
worker1.onmessage = function(event) {
console.log("worker1", [].slice.call(new Uint8Array(event.data)));
};
worker1.onerror = function(error) { console.error("worker1", error.message); };
worker2.onmessage = function(event) {
console.log("worker2", [].slice.call(new Uint8Array(event.data)));
};
worker2.onerror = function(error) { console.error("worker2", error.message); };
worker3.onmessage = function(event) {
console.log("worker3", [].slice.call(new Uint8Array(event.data)));
};
worker3.onerror = function(error) { console.error("worker3", error.message); };
var u81 = new Uint8Array(8);
var u82 = new Uint8Array(8);
var u83 = new Uint8Array(8);
worker1.postMessage(u81.buffer, [u81.buffer]);
worker2.postMessage(u82.buffer, [u82.buffer]);
worker3.postMessage(u83.buffer, [u83.buffer]);
onmessage = function(event) {
var u8 = new Uint8Array(event.data);
u8.set([1,1,2,3,4,5,6,7]);
self.postMessage(u8.buffer, [u8.buffer]);
self.postMessage([1,0]);
self.postMessage([1,1]);
self.postMessage([1,2]);
self.postMessage([1,3]);
self.postMessage([1,4]);
self.postMessage([1,5]);
self.postMessage([1,6]);
self.postMessage([1,7]);
self.postMessage([1,8]);
self.postMessage([1,9]);
};
onmessage = function(event) {
var u8 = new Uint8Array(event.data);
u8.set([2,1,2,3,4,5,6,7]);
self.postMessage(u8.buffer, [u8.buffer]);
self.postMessage([2,0]);
self.postMessage([2,1]);
self.postMessage([2,2]);
self.postMessage([2,3]);
self.postMessage([2,4]);
self.postMessage([2,5]);
self.postMessage([2,6]);
self.postMessage([2,7]);
self.postMessage([2,8]);
self.postMessage([2,9]);
};
onmessage = function(event) {
var u8 = new Uint8Array(event.data);
u8.set([3,1,2,3,4,5,6,7]);
self.postMessage(u8.buffer, [u8.buffer]);
self.postMessage([3,0]);
self.postMessage([3,1]);
self.postMessage([3,2]);
self.postMessage([3,3]);
self.postMessage([3,4]);
self.postMessage([3,5]);
self.postMessage([3,6]);
self.postMessage([3,7]);
self.postMessage([3,8]);
self.postMessage([3,9]);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment