SlideShare a Scribd company logo
Node.js で学ぶマルチスレッドプログラミング入門サイボウズ・ラボ / Shibuya.pm竹迫 良範 @TAKESAKO
2009/04/06Cybozu University2JavaScript
sleep のない言語 JavaScriptどうやって実現するか?function sleep(msec) { // CPU_100%  var t = (new Date()).getTime()-(-msec);   while ( (new Date()).getTime() < t ) {} }function sleep(msec) {   // LiveConnect  Packages.java.lang.Thread.sleep(msec); }
クロスブラウザで sleep を実現(無理矢理)function sleep(msec) {   try { // for IEwindow.showModalDialog(       "javascript:document.write('<script>"       + "window.setTimeout(function(){window.close()},"       +  msec + ");<"\/script>');");   } catch (e) {     try { // for Firefox, Opera with LiveConnectPackages.java.lang.Thread.sleep(msec);     } catch (e) {  // for Safari and others var limit = (new Date()).getTime() - (-msec);       while ((new Date()).getTime() < limit) {}     }   } }
1秒ごとに表示したい(よくある間違い)<script>function sleep(msec) {var t = (new Date()).getTime() - (-msec);  while ( (new Date()).getTime() < t );}function init() {var body = document.body;  sleep(1000);body.innerHTML += "<h1>Hello!</h1>";  sleep(1000);body.innerHTML += "<h2>Hello?</h2>";  sleep(1000);body.innerHTML += "<h3>Hello!?</h3>";};</script><body onload="init()"></body>
問題1:sleep している間 CPU_100% (><)
問題2:3秒後にまとめて表示される
setTimeoutで1秒ごとに表示する(正解)<script>setTimeout(function(){var body = document.body;body.innerHTML += "<h1>Hello!</h1>";setTimeout(function(){body.innerHTML += "<h2>Hello?</h2>";setTimeout(function(){body.innerHTML += "<h3>Hello!?</h3>";    }, 1000);  }, 1000);}, 1000);</script>
setTimeout.html – シングルスレッド+遅延
2009/04/06Cybozu University10				}, 1000);			}, 1000);		}, 1000);	}, 1000);}, 1000);
2009/04/06Cybozu University11				});			});		});	});});
yield
yield で1秒ごとに表示<!DOCTYPE html><title>Firefox2.0+ only</title><script type="application/javascript;version=1.7">(function(g){var f=arguments.callee;setTimeout( function(){f(g)},g.next())})((function(){  yield (1000);document.body.innerHTML += "<h1>Hello!</h1>";  yield (1000);document.body.innerHTML += "<h2>Hello?</h2>";  yield (1000);document.body.innerHTML += "<h3>Hello!?</h3>";})());</script>
yield.html– 疑似マルチタスク処理
やりたいこと = 細かく setTimeoutを呼ぶ// こんな風に書けたらいいなぁ(><)  for (var i = 0; i < 10000000; i++) {	//   すん	//  ごく	//   重たい	//    処理	//   ・・・setTimeout(次の行, 0); // ブラウザに処理を戻す	// でもループの中は繰り返したい  }  // 終了
JavaScript 1.7(Firefox 2.0+)
yield を含む関数は Generator になるfunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator(); // [object Generator]// まだ document.title は変更されない
Generator#nextで次の yield まで実行戻るfunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator(); // [object Generator]g.next(); // document.title = 1;g.next(); // document.title = 2;g.next(); // document.title = 3;
uncaught exception: [object StopIteration]function generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator();for (var j = 1; j <= 998; j++) { g.next() }g.next(); // document.title = 999;g.next(); // document.title = 1000;g.next(); // Error: uncaught exception:           //       [object StopIteration]
Generator#closefunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator();for (var j = 1; j <= 998; j++) { g.next() }g.next(); // document.title = 999;g.next(); // document.title = 1000;g.close();
yield の引数が next() の戻り値になるfunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield (i);	}}var g = generator();var r;r = g.next(); // r = 1;r = g.next(); // r = 2;r = g.next(); // r = 3;
next() の戻り値をチェックしてきちんと終了function generator() {	for (var i = 1; i <= 1000; i++) {document.title = i;		yield (i);	}	yield (-1); // 終了条件}var g = generator();var r;do { r = g.next() } while (r > 0); // 1...1000g.close();
巨大ループ中で setTimeout(f, 0) が呼べる!function generator() {	for (vari = 1; i <= 1000; i++) {document.title = i;		yield true;	}	yield false;}function driveGenerator(g) {    if (g.next()) { //  yield true?var f = function(){ driveGenerator(g) };setTimeout(f, 0);	} else {g.close(); //  yield false    }}driveGenerator( generator() );
yield + setTimeoutイディオムが完成(function(g){var f=arguments.callee;var t=g.next(); (t<0) ? g.close():setTimeout(function(){f(g)},t)})((function(){  for (vari = 0; i < 10000; i++) {document.title = i; // 重たい処理    yield (0); // ブラウザに一旦処理を戻す(setTimeout)  }  yield (-1); // 終了})());
yield すごい !
 でも… Firefoxでしか…
JavaScript1.7 の指定をしないと yield 動かない<script type="application/javascript;version=1.7">(function(g){var f=arguments.callee;var t=g.next(); (t<0) ? g.close():setTimeout(function(){f(g)},t)})((function(){  for (vari = 0; i < 10000; i++) {document.title = i; // 重たい処理    yield (0); // ブラウザに一旦処理を戻す(setTimeout)  }  yield (-1); // 終了})());</script>
28
HTML5 関連Web Workers
HTML5 Web Workers APImain.htmlworker.js(1) var worker = new Worker(“worker.js”);ワーカースレッドの作成(2) worker.postMessage(”hello”);(3) onmessage = function(e) {var result = e.data + ”!”;(4)   postMessage(result);(5) worker.onmessage = function(e) {       // DOM 更新処理window.alert(e.data);
ワーカスレッドを呼び出す UIスレッドworker.html<title>HTML5 Web Workers</title><script>var worker = new Worker("worker.js");worker.onmessage = function(e){document.body.innerHTML += e.data;}worker.postMessage("hello");</script>
ワーカスレッドの定義(重たい処理を分離)worker.jsfunction sleep(msec) {var t = (new Date()).getTime() - (-msec);  while ( (new Date()).getTime() < t );}//↓ワーカ側でメッセージを受信したときの処理onmessage = function(e) {  sleep(1000);postMessage("<h1>" + e.data + "!</h1>");}
Web Workers のセキュリティUIスレッドワーカスレッドwindow.document.write(“hoge”)Workerスレッドからはwndowオブジェクトに触れない!CPU_100%でもブラウザ固まらない!
Firefox, Safari, Chrome で動作
2009/04/06Cybozu University35Node.js拡張できる?
2009/04/06Cybozu University36
2009/04/06Cybozu University37
v8-juice
jsthread.sourceforge.net
40

More Related Content

PDF
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
PDF
PDF
テーマ「最適化」
PDF
GContractsの基礎
PDF
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
PDF
Async design with Unity3D
PPTX
タイマー
PDF
Siv3Dで楽しむゲームとメディアアート開発
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
テーマ「最適化」
GContractsの基礎
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Async design with Unity3D
タイマー
Siv3Dで楽しむゲームとメディアアート開発

What's hot (20)

PDF
Spockの基礎
PDF
Precise garbage collection for c
PDF
大阪Node学園 六時限目 「generator小咄」
PDF
Try Webworkers
PDF
Qt Creator を拡張する
PDF
Effective modern-c++#9
PDF
Boost.Coroutine
PDF
Continuation with Boost.Context
PDF
第12回計算機構成
PDF
Android Lecture #03 @PRO&BSC Inc.
PDF
effective modern c++ chapeter36
PDF
ASP.NETを利用したAJAX開発の応用
PDF
第10回 計算機構成
PDF
RGtk2入門
PDF
Unityで覚えるC#
PDF
第6回鹿児島node.jsの会資料_内村
PDF
New features of Groovy 2.0 and 2.1
PPTX
UniRxことはじめ
PDF
About GStreamer 1.0 application development for beginners
PPTX
Node.js - sleep sort algorithm
Spockの基礎
Precise garbage collection for c
大阪Node学園 六時限目 「generator小咄」
Try Webworkers
Qt Creator を拡張する
Effective modern-c++#9
Boost.Coroutine
Continuation with Boost.Context
第12回計算機構成
Android Lecture #03 @PRO&BSC Inc.
effective modern c++ chapeter36
ASP.NETを利用したAJAX開発の応用
第10回 計算機構成
RGtk2入門
Unityで覚えるC#
第6回鹿児島node.jsの会資料_内村
New features of Groovy 2.0 and 2.1
UniRxことはじめ
About GStreamer 1.0 application development for beginners
Node.js - sleep sort algorithm
Ad

Similar to Node.js - JavaScript Thread Programming (20)

PPT
Javascriptで無限ループを実現する5つの方法
PDF
Flow.js
PDF
Introduction pp.js
PPTX
Async awaitでの繰り返し処理についての小話
PDF
Project Loom - 限定継続と軽量スレッド -
PPTX
Reactive Programming
PPTX
ES6,7で書ける JavaScript
PPTX
Reactive
PDF
東京Node学園#3 Domains & Isolates
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
Kanazawa.js.Next
PDF
コルーチンを使おう
PDF
Enumerable lazy について
PPTX
Web Workers
PDF
setTimeout関数の楽しみ
PDF
PHPにおけるI/O多重化とyield
PDF
Node-v0.12の新機能について
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
PDF
Node.js入門
KEY
Inside frogc in Dart
Javascriptで無限ループを実現する5つの方法
Flow.js
Introduction pp.js
Async awaitでの繰り返し処理についての小話
Project Loom - 限定継続と軽量スレッド -
Reactive Programming
ES6,7で書ける JavaScript
Reactive
東京Node学園#3 Domains & Isolates
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
Kanazawa.js.Next
コルーチンを使おう
Enumerable lazy について
Web Workers
setTimeout関数の楽しみ
PHPにおけるI/O多重化とyield
Node-v0.12の新機能について
C#次世代非同期処理概観 - Task vs Reactive Extensions
Node.js入門
Inside frogc in Dart
Ad

More from takesako (18)

PDF
SECCON CTF セキュリティ競技会コンテスト開催について
PDF
Acme minechan
PDF
Acme::MineChan LT demo
PPTX
x86x64 SSE4.2 POPCNT
PPTX
再帰的 正規表現JSON Validator
PDF
正規表現‐もう一つのバベルの塔‐木村浩一
PDF
Perl6 Regex Programming with Rakudo
PDF
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
PDF
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
PDF
Perl x86 JIT Programming
PPT
YAPC::Asia 2008 Closing Ceremony
PPT
HTML Binary Hacks & GIF89a Ployglot
PDF
Devsumi2008 - YAPC::Asia 2008 Tokyo
PPT
GIF89a Oldtype
PPT
Shibuyajs Digest
PPT
HTML2.0 - digg - OSC2007-fall
PPT
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
PPT
Shibuyajs24 JavaScript.GIF x LiveConnect
SECCON CTF セキュリティ競技会コンテスト開催について
Acme minechan
Acme::MineChan LT demo
x86x64 SSE4.2 POPCNT
再帰的 正規表現JSON Validator
正規表現‐もう一つのバベルの塔‐木村浩一
Perl6 Regex Programming with Rakudo
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Perl x86 JIT Programming
YAPC::Asia 2008 Closing Ceremony
HTML Binary Hacks & GIF89a Ployglot
Devsumi2008 - YAPC::Asia 2008 Tokyo
GIF89a Oldtype
Shibuyajs Digest
HTML2.0 - digg - OSC2007-fall
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuyajs24 JavaScript.GIF x LiveConnect

Node.js - JavaScript Thread Programming