Movatterモバイル変換


[0]ホーム

URL:


takesako, profile picture
Uploaded bytakesako
PPTX, PDF1,918 views

Node.js - JavaScript Thread Programming

Embed presentation

Downloaded 14 times
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(       "#
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

Recommended

PDF
Siv3Dで楽しむゲームとメディアアート開発
PPTX
タイマー
PDF
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
PDF
GContractsの基礎
PDF
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
PDF
Async design with Unity3D
PDF
テーマ「最適化」
PDF
Gocon2013
PPTX
UniRxことはじめ
PDF
Continuation with Boost.Context
PDF
About GStreamer 1.0 application development for beginners
PDF
ASP.NETを利用したAJAX開発の応用
PPTX
Node.js - sleep sort algorithm
PDF
Boost.Coroutine
 
PDF
Unityで覚えるC#
PDF
Spockの基礎
PDF
Effective modern-c++#9
PDF
Qt Creator を拡張する
PDF
第10回 計算機構成
PDF
Try Webworkers
PDF
Android Lecture #03 @PRO&BSC Inc.
PDF
RGtk2入門
PDF
New features of Groovy 2.0 and 2.1
PDF
Precise garbage collection for c
PDF
effective modern c++ chapeter36
PDF
大阪Node学園 六時限目 「generator小咄」
PDF
第12回計算機構成
PDF
第6回鹿児島node.jsの会資料_内村
PDF
Flow.js
 
KEY
Inside frogc in Dart

More Related Content

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

What's hot

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

Similar to Node.js - JavaScript Thread Programming

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

More from takesako

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

Node.js - JavaScript Thread Programming


[8]ページ先頭

©2009-2025 Movatter.jp