0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

javascript web worker の基本

Posted at

はしがき

プログラミングをしながら、ふいと気づきました。
「javascript は single thread だ、しかし、multi thread のように動いている」
「本当に thread が必要になったら、どうすればいい?」
とか...考えが浮き出した。

それで、javascript も multi thread ができるか?がきになって、検索しました。

javascript の multi thread っぽい single thread とは?

確かに、javascript は single thread です。javascript の main thread の event loop が single thread なので、single thread です。

が、非同期もあるので、multi thread のように動かせることです。

web worker

「非同期があるので、multi thread はいらない?」かもしれませんが、web worker は実行難しいことを background で実行するためのことです。

使い方

まず、基本的な A × B の calculator を作ります。

<!-- 省略 -->
<div>hello, world</div>
<input id="number1" class="number1" type="number">
<input id="number2" type="number">
<div class="result">3</div>
<!-- 省略 -->

ここから、<input> から入力すれば、<input> のことを掛け算する function を実行して、result に入力します。

// index.js
const first = document.querySelector('#number1')
const second = document.querySelector('#number2')

const result = document.querySelector('.result')

[first, second].forEach(input => {
  input.onchange = function() {
    result.textContent = first.value * second.value
  }
})

image.png

このような感覚です。うまくできました。


今回は掛け算なので、すぐできますが、もし、時間が結構かかるときがあります。
それのために、web worker をつかって、background から実行できるようにしましょう。

// index.js
const first = document.querySelector('#number1')
const second = document.querySelector('#number2')

const result = document.querySelector('.result')

if (window.Worker) {
  const myWorker = new Worker('worker.js') // file name

  [first, second].forEach(input => {
    input.onchange = function() {
      myWorker.postMessage([first.value, second.value])
      console.log('Message posted to worker')
    }
  })

  myWorker.onmessage = function(e) {
    result.textContent = e.data
    console.log('Message received from worker')
  }
} else {
  console.log('Your browser doesn\'t support web workers.')
}

// worker.js
onmessage = function(e) {
    const data = e.data
    this.setTimeout(() => {
        postMessage(data[0] * data[1])
        console.log('after 5 seconds')
    }, 5000)
}

image.png

今回もうまくできました。
5秒もかかることでしたが、worker を別の thread に分かれて、実行できました。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?