SlideShare a Scribd company logo
1 of 39
Web Workerで〇〇する話
Niigata.js #1
自己紹介
ushiboy
プログラマ
SPAアプリ開発が多め
使う言語はJavaScript 8割、pythonが2割みたいな感じ
Web Worker
ご存知ですか or おぼえてますか
Web Workerについて三行で
Webブラウザにマルチスレッドをもたらした。
Worker内だけの独自コンテキストをもつ。
Workerの外部とはメッセージングでやり取り。
ちょっと振り返り(JavaScriptの同期処理)
基本的にメインスレッド(UIスレッド)だけなので、注意が
必要だった。
例1 Busyなループ
function loopSync() {
for (var i = 0; i < 1000000000; i++) {
// busyなループ
}
console.log('finish!');
}
document.getElementById('btn').addEventListener('click', function(evt) {
loopSync(); // これが終わるまで何もかも待たされる
}, false);
例2 同期なHTTP通信
document.getElementById('btn').addEventListener('click', function(evt) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/slow', false); // 第3引数のasyncフラグをオフにして"同期"通信に
xhr.send(null); // レスポンスくるまで待たされる
console.log(xhr.responseText);
}, false);
そして出てくるダイアログ
※ブラウザに寄ります
なので
ふつうは非同期なAPIを使う。
setTimeout駆使したり
XMLHttpRequestは非同期で使う
Workerを使うと...
function loopSync() {
for (var i = 0; i < 1000000000; i++) {
// busyなループ
}
console.log('finish!');
}
loopSync();
document.getElementById('btn').addEventListener('click', function(evt) {
new Worker('worker.js');
}, false);
重い部分をworker用にスクリプトごと分離
Workerを作って使う
これによって、ブラウザが怒らない
※繰り返しますが、ブラウザに寄ります
もうちょっと詳しく見ていきます
というわけで...
Workerを使うためには
ワーカー用のスクリプトのURI渡してインスタンスを生成する
var worker = new Worker('worker.js');
このときのURIは同一生成ポリシーに従う必要がある。
メッセージのやりとり
Worker
UI
postMessageで送る。
onmessageで受け取る。
worker.postMessage('start');
worker.onmessage = function(evt) { // MessageEvent
console.log(evt.data);
};
(もうちょっと)メッセージのやりとり
Worker
UI
postMessageで送るデータは共有ではなくコピーされる。
onmessageで受けとったものはコピー。
worker.postMessage({ count: 1000 });
worker.onmessage = function(evt) { // MessageEvent
console.log(evt.data);
};
同一のインスタンスを共有せずに双方で複製。
(番外)メッセージのやりとり
postMessageで送るデータは共有ではなくコピーされる。
巨大なデータを送る場合にパフォーマンスを良くするため、
所有権の譲渡(Transferable Objects)という仕組みがある。
が、今回は省略...
参考
https://developer.mozilla.org/ja/docs/Web/Guide/Performance/Using_web_workers#Passing_data_by_transferring_ownership_(transferable_objec
ts)
Workerの中
selfがグローバルスコープショートカット(UI側のwindow)
windowやdocumentなど触れないものがある
詳しくは https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers
外部スクリプトはimportScriptsで読み込む
WorkerがさらにWorkerを生成とかもできる。
self.onmessage = function(evt) {
if (evt.data === 'start') {
self.postMessage('fin');
} else if (evt.data === 'stop') {
self.close();
}
};
importScripts(‘foo.js’, ‘hoge.js’);
Workerの止め方
terminate呼ぶ。
ワーカー自身が内部からclose。
worker.terminate();
self.close();
Worker内でのエラー
ErrorEventになるのでonerrorで拾える。
worker.onerror = function(evt) { // ErrorEvent
console.log(evt.message); // “Uncaught Error:/(^o^)\”
console.log(evt.lineno); // 12
};
Workerの種類
Dedicated Worker : 今まで見てきたやつ
Shared Worker : 複数のスクリプトから共有できるやつ
Service Worker : オフラインアプリにするときに役に立つやつ
Chrome Worker : Firefox限定(アドオン用?)
Audio Worker : オーディオ処理用(らしい)
ブラウザの対応状況(デスクトップ系)
細かい機能レベルになるともっと分かれる模様
参考 https://developer.mozilla.org/ja/docs/Web/Guide/Performance/Using_web_workers#Browser_compatibility
Internet Explorer 10.0+
Firefox 3.5+
Chrome 4+
Opera 10.6+
Safari 4+
ちなみにpolyfillがあるっぽい
が、そもそもpolyfillでどうにかなるものではない...
参考: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#web-workers
ホントそれ
Web Worker
使ってますか?
ちなみに私は...
まったく使ってない\(^o^)/
自分の対象範囲だと重い処理やるケースない...
サーバーとJSONでお話するのがほとんど…
このままではタイトル詐欺になってしまう…
というわけで、ここから本題
ここでもう一度図をみてみる
じーっと見ていると...
Worker
UI
Fluxと似てますね
※強引な気がするのは気のせいです。
というわけで
この辺りをまるっとワーカーに入れてみる
Web Workerで(雑に)Fluxする
お題:カウンターアプリ
WARNING!!!!!
ここからコードがEcmaScript2015になりま
す
UI側
function Counter(props) {
const { count, plus, minus } = props;
return (
<div>
<div>{count}</div>
<button onClick={plus}>+</button>
<button onClick={minus}>-</button>
</div>
);
}
Counterコンポーネントを用意
UI側
import React from 'react';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.worker = props.worker;
this.worker.onmessage = evt => {
this.setState(evt.data);
};
}
/** 右へ続く -> **/
/** 続き **/
render() {
const { count } = this.state;
return (
<Counter count={count}
plus={this.handlePlus.bind(this)}
minus={this.handleMinus.bind(this)} />
);
}
/** 次のスライドへ続く **/
ControllerViewとしてAppを用意
UI側
/** 前のスライドからの続き **/
handlePlus() {
this.worker.postMessage({
type: 'UPDATE_COUNT',
payload: {
value: 1
}
});
}
/** 右へ続く -> **/
/** 続き **/
handleMinus() {
this.worker.postMessage({
type: 'UPDATE_COUNT',
payload: {
value: -1
}
});
}
}
アプリケーションコンテナを用意
UI側
import { render } from 'react-dom';
render(
<App worker={new Worker('back.js')} />,
document.getElementById('app')
);
アプリの起動部分
Worker側
const state = {
count: 0
};
onmessage = evt => {
postMessage(store(state, evt.data));
};
// initialize
postMessage(state);
function store(state, action) {
const { type, payload } = action;
switch (type) {
case 'UPDATE_COUNT':
return updateCount(state, payload);
default:
return state;
}
}
function updateCount(state, payload) {
const { value } = payload;
state.count += value;
return state;
}
やってみた感じ
一方通行のデータフローの制限が自然に生まれる
メッセージングのデータは複製されるので、UI側に渡すときに自分でステート
をイミュータブルにしなくて良い
Immutable.jsとかでやらなくて良い
(雑すぎてDispatcher端折っちゃった)
同じようなこと考えてる人いるっぽい
参考 https://medium.com/@nsisodiya/flux-inside-web-workers-cc51fb463882#.8apt7vhfh
まとめ
Workerの中ならば必ずしも非同期じゃなくてもよい。
状況に応じて同期・非同期を選択できる。
Workerを積極的に取り入れたアーキテクチャ時代が来る(かもしれない)

More Related Content

What's hot

Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
Yuusuke Takeuchi
 
寝プログラミングのススメ
寝プログラミングのススメ寝プログラミングのススメ
寝プログラミングのススメ
Yoshitaka Kawashima
 

What's hot (20)

Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得
 
UXデザインの資格ってどんなの? HCD-Net認定 人間中心設計スペシャリスト・人間中心設計専門家
UXデザインの資格ってどんなの? HCD-Net認定 人間中心設計スペシャリスト・人間中心設計専門家UXデザインの資格ってどんなの? HCD-Net認定 人間中心設計スペシャリスト・人間中心設計専門家
UXデザインの資格ってどんなの? HCD-Net認定 人間中心設計スペシャリスト・人間中心設計専門家
 
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
 
CRDT in 15 minutes
CRDT in 15 minutesCRDT in 15 minutes
CRDT in 15 minutes
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ユーザーインタビューするときは、どうやらゾンビのおでましさ
ユーザーインタビューするときは、どうやらゾンビのおでましさユーザーインタビューするときは、どうやらゾンビのおでましさ
ユーザーインタビューするときは、どうやらゾンビのおでましさ
 
寝プログラミングのススメ
寝プログラミングのススメ寝プログラミングのススメ
寝プログラミングのススメ
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
OSSを利用したプロジェクト管理
OSSを利用したプロジェクト管理OSSを利用したプロジェクト管理
OSSを利用したプロジェクト管理
 
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用するC++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
 
インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
Git超入門_座学編.pdf
Git超入門_座学編.pdfGit超入門_座学編.pdf
Git超入門_座学編.pdf
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 

Viewers also liked

クラウド電話を使ってモーニングコールで起床する生活
クラウド電話を使ってモーニングコールで起床する生活クラウド電話を使ってモーニングコールで起床する生活
クラウド電話を使ってモーニングコールで起床する生活
Yoshiki TAKADA
 
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
KatsuyaENDOH
 
Prototypeベース in JavaScript
Prototypeベース in JavaScriptPrototypeベース in JavaScript
Prototypeベース in JavaScript
Ryo Maruyama
 

Viewers also liked (20)

Nds meetup8 lt
Nds meetup8 ltNds meetup8 lt
Nds meetup8 lt
 
Web Worker +α - HTML5/JavaScript and Service Worker API
Web Worker +α - HTML5/JavaScript and Service Worker APIWeb Worker +α - HTML5/JavaScript and Service Worker API
Web Worker +α - HTML5/JavaScript and Service Worker API
 
Web workers
Web workersWeb workers
Web workers
 
three.jsを「遅い」と思わせないデータの扱い方
three.jsを「遅い」と思わせないデータの扱い方three.jsを「遅い」と思わせないデータの扱い方
three.jsを「遅い」と思わせないデータの扱い方
 
Web Worker - Freelancing on the Web for Pinoys
Web Worker - Freelancing on the Web for PinoysWeb Worker - Freelancing on the Web for Pinoys
Web Worker - Freelancing on the Web for Pinoys
 
Web workers
Web workersWeb workers
Web workers
 
海外で注目されてるJs framework “mithril”の特徴
海外で注目されてるJs framework “mithril”の特徴海外で注目されてるJs framework “mithril”の特徴
海外で注目されてるJs framework “mithril”の特徴
 
クラウド電話を使ってモーニングコールで起床する生活
クラウド電話を使ってモーニングコールで起床する生活クラウド電話を使ってモーニングコールで起床する生活
クラウド電話を使ってモーニングコールで起床する生活
 
HTML5의 web worker
HTML5의 web workerHTML5의 web worker
HTML5의 web worker
 
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
 
そろそろ押さえておきたい AngularJSのセキュリティ
そろそろ押さえておきたい AngularJSのセキュリティそろそろ押さえておきたい AngularJSのセキュリティ
そろそろ押さえておきたい AngularJSのセキュリティ
 
jQuery勉強会#4
jQuery勉強会#4jQuery勉強会#4
jQuery勉強会#4
 
ES6 はじめました
ES6 はじめましたES6 はじめました
ES6 はじめました
 
150421 es6とかな話
150421 es6とかな話150421 es6とかな話
150421 es6とかな話
 
JavaScript : What is it really? AND Some new features in ES6
JavaScript : What is it really? AND Some new features in ES6JavaScript : What is it really? AND Some new features in ES6
JavaScript : What is it really? AND Some new features in ES6
 
JavaScript.Next Returns
JavaScript.Next ReturnsJavaScript.Next Returns
JavaScript.Next Returns
 
kontainer-js
kontainer-jskontainer-js
kontainer-js
 
FileReader and canvas and server silde
FileReader and canvas and server sildeFileReader and canvas and server silde
FileReader and canvas and server silde
 
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, PerformanceJavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
 
Prototypeベース in JavaScript
Prototypeベース in JavaScriptPrototypeベース in JavaScript
Prototypeベース in JavaScript
 

Similar to Web Workerで○○する話

Web Workers
Web WorkersWeb Workers
Web Workers
kaboccha
 
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
Mori Shingo
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれ
Masataka MIZUNO
 

Similar to Web Workerで○○する話 (20)

SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
 
LogicFlow 概要
LogicFlow 概要LogicFlow 概要
LogicFlow 概要
 
Web Workers
Web WorkersWeb Workers
Web Workers
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
 
Clrh 110827 wfho
Clrh 110827 wfhoClrh 110827 wfho
Clrh 110827 wfho
 
HTTPとサーブレット
HTTPとサーブレットHTTPとサーブレット
HTTPとサーブレット
 
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
 
勉強会資料①
勉強会資料①勉強会資料①
勉強会資料①
 
Nginx
NginxNginx
Nginx
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれ
 
Lt 110416
Lt 110416Lt 110416
Lt 110416
 
Web API(Dynamics 365 )勉強会
Web API(Dynamics 365 )勉強会Web API(Dynamics 365 )勉強会
Web API(Dynamics 365 )勉強会
 
2016/12/17 ASP.NET フロントエンドタスク入門
 2016/12/17 ASP.NET フロントエンドタスク入門 2016/12/17 ASP.NET フロントエンドタスク入門
2016/12/17 ASP.NET フロントエンドタスク入門
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Web Workerで○○する話