Skip to main content
Recommended
PDF
Bài giảng thiết kế cầu BTCT theo tiêu chuẩn mới TCVN 118232017
PDF
Học Tiếng Anh Xây Dựng Part 1 - Danh Mục Bản Vẽ Kiến Trúc
PPT
Biện pháp thay dàn cầu đường sắt Tân An - Bình Định
PDF
Bài giảng kết cấu thép đặc biệt.pdf
PDF
GT Nền móng - Lê Anh Hoàng
PDF
đồ áN tốt nghiệp chung cư lucky tower
DOCX
Đồ án Tổ chức thi công công trình dân dụng
PDF
huong dan tinh khung bang sap2000
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
PDF
Node-v0.12のTLSを256倍使いこなす方法
PDF
PDF
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
PPTX
PDF
httpbis interim@チューリッヒ レポート
PDF
Node.js で SPDYのベンチマーク体験サイトを作りました
PDF
PDF
PDF
第43回HTML5とか勉強会 SPDY/QUICデモ
PDF
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
PDF
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
PDF
HTTP/2.0がもたらすWebサービスの進化(後半)
PPTX
node-gypを使ったネイティブモジュールの作成
PDF
PDF
PDF
PDF
PDF
いまさら聞けない!?Backbone.js 超入門
PDF
PPTX
More Related Content
PDF
Bài giảng thiết kế cầu BTCT theo tiêu chuẩn mới TCVN 118232017
PDF
Học Tiếng Anh Xây Dựng Part 1 - Danh Mục Bản Vẽ Kiến Trúc
PPT
Biện pháp thay dàn cầu đường sắt Tân An - Bình Định
PDF
Bài giảng kết cấu thép đặc biệt.pdf
PDF
GT Nền móng - Lê Anh Hoàng
PDF
đồ áN tốt nghiệp chung cư lucky tower
DOCX
Đồ án Tổ chức thi công công trình dân dụng
PDF
huong dan tinh khung bang sap2000
Viewers also liked
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
PDF
Node-v0.12のTLSを256倍使いこなす方法
PDF
PDF
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
PPTX
PDF
httpbis interim@チューリッヒ レポート
PDF
Node.js で SPDYのベンチマーク体験サイトを作りました
PDF
PDF
PDF
第43回HTML5とか勉強会 SPDY/QUICデモ
PDF
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
PDF
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
PDF
HTTP/2.0がもたらすWebサービスの進化(後半)
PPTX
node-gypを使ったネイティブモジュールの作成
PDF
PDF
PDF
PDF
PDF
いまさら聞けない!?Backbone.js 超入門
Similar to Stream2の基本
PDF
PPTX
PDF
東京Node学園#3 Domains & Isolates
PDF
PPT
PPTX
PPTX
PDF
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
PPTX
PPTX
PDF
Reactive Extensionsで非同期処理を簡単に
PDF
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
PDF
PDF
PPTX
PDF
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PDF
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
PDF
More from shigeki_ohtsu
PDF
PDF
PDF
PDF
PDF
Technical Overview of QUIC
PPTX
httpbis interim とhttp2.0相互接続試験の話
PPTX
Stream2の基本 1. 2. 3. 4. 5. 6. 7. 8. Stream1 の問題
var server = http.createServer(function(req, res) {
setTimeout(function() {
var data = '';
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
console.log(data);
});
res.writeHead(200);
res.end();
}, 1000);
}).listen(8080);
POSTデータをちゃんと取れる?
9. 10. 11. 12. 13. 14. Readable 返り値
実
装
者
用
_read(n) Streamから呼ばれる。 n は hwm を指す。 N/A
push(chunk) 内部バッファの最後にchunkを加える。 (chunkはBufferか文
字列、ただし objectMode じゃない時)
chunk を null にすると endイベントが発生
true hwm以下
false hwm 以上
消
費
者
用
setEncoding(en
c)
StringDecoderを指定する。内部バッファにはdecodeしたも
のが加えられる。
undefined
read(n) 内部バッファから n バイトデータを読み込む。 n が
undefined の場合は内部データ全部
バッファ
unshift(chunk) 内部バッファの先頭にchunkを加える。
chunk を null にすると endイベントが発生
true hwm以下
false hwm 以上
パ
イ
プ
pipe(dest,
pipOpts)
dest(WritableStream)とつなげて書き込む。 {end: false} のオ
プションで src の end イベントに伴って自動的に dst.end
しない。
複数 dest をつなげることが可能
dest
unpipe(dest) dest との pipe を外す。destが指定されてない場合は全ての
pipe を外す。
src
旧
モ
ー
ド
用
resume() 省略 (このメソッドがされると旧モード互換になる。)
pause() 省略 (このメソッドがされると旧モード互換になる。)
wrap(stream) stream1 のオブジェクトを stream2 に変換するラッパー self
ReadableStream API methods
15. ReadableStream API events
イベント名 説明 引数
readable 内部バッファのデータが消費できる時に発生するイ
ベント。(でも実は発生条件が結構複雑)
N/A
end ソースから読み込むデータの終わりを通知された時
に発生するイベント。実質的には Readable.pull(null)
されたタイミングで発生するものと考えていいだろ
う。(例外有)
データを消費(Readable.read) されていないと発生し
ないので注意。
N/A
error 省略 エラーオブ
ジェクト
data 旧モードでデータを受けるイベント。このリスナが
登録されていると旧モード互換になる。
データバッ
ファ
16. 17. 覚えておこう大切なこと
Readable.read(n) ただし n>0
• ストリーム内部バッファのデータを消費者が読み
込む(消費する)関数
• 消費者が利用する
• n バイトを取得。読み込みデータが空だと nullが
返る。
• n を指定しない場合はストリーム内部の全データ
を取得。通常はこれ。
• n が highWaterMark以上 だとストリームの最大値
が上がるので注意。
• 通常 readable イベントに合わせて実行する。(他
でも使えるけど)
18. 19. 覚えておこう大切なこと
Readable.push(chunk)
• ソースからストリームへデータ(chunk)を送り込む関数。
実装者が利用する。
• pushされた chunk はストリームの内部バッファの最後に
加えられる。
• (おおよそ)push に合わせて readable イベントが発火す
ると考えていいだろう。(例外あり)
• ストリームが満タン(内部バッファの容量が
highWaterMark以上)の時は push は false を返す。(でも
無理やり詰め込める)
• 何も渡すデータが無い時、 _read() が呼ばれたら push(‘’)
をしておきましょう。
• データ送りの終りは push(null) を実行。これがないと end
イベントが発生しないので必ずやろう。
• push() をするとストリームが先読み機能で内部に読み込
めるだけ read(0) を繰り返してきます。無駄な _read() に
20. 21. 22. 一番簡単なサンプル(同期)
var source = *‘a’, ‘b’, ‘c’, null+;
var Readable = require(‘stream’).Readable;
Readable.prototype._read = function() {
this.push(source.shift()); // 同期
};
var rstream = new Readable();
var data = ‘’;
rstream.on(‘readable’, function() ,
var b = rstream.read();
if (b) data += b;
});
rstream.on(‘end’, function() ,
console.log(‘data =‘ + b);
});
消費者
実装者
ソース
23. 24. 25. 26. 注意
var Readable = require(‘readable’).Readable;
Readable.prototype._read = function() {
this.push(‘hoge’);
}
var rstream = new Readable();
var data = ‘’;
rstream.on(‘readable’, function() ,
var b = rstream.read();
if (b) data += b;
});
rstream.on(‘end’, function() ,
console.log(‘data=‘ + data);
});
EOFがない!
無限同期読み込み
27. 28. 29. 課題3
以下の条件でソースのデータが全
部読み込めるようにしましょう
条件 値
テスト
1
n1 > hwm > n2 n1 = 3, hwm =2, n2 = 1
テスト
2
n1 > n2 > hwm n1 = 3, hwm =1, n2 = 2
テスト
3
hwm > n1 > n2 n1 = 2, hwm =3, n2 = 1
テスト
3
hwm > n2 > n1 n1 = 1, hwm =3, n2 = 2
ソース: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
読み込み: 非同期(1秒毎)
読み込み条件
• Readable.read(n1),
• new Readable {highWaterMark: hwm})
• Readable.push(chunk) ただし chunk.length === n2
30. 31. 32. WritableStream API methods
WritableStream 返り値
実
装
者
用
_write(chunk, encoding, cb) ストリームからリソースへデータを書き出す
関数。実装者が利用です。完了したら cb を実
行。
書き込みにエラーがあったら 第一引数をエ
ラーにして cb を実行する。
生
産
者
用
write(chunk, [encoding], [cb]); WritableStream を経由してリソースにデータ
を書き込む。書き込みが完了したら cb が起動
される。
true hwm以下
false hwm 以上
end([chunk], [encoding], [cb]); 書き込み終了を実行する。リソースがすべて
書き込まれたら finish イベントが発火する。
33. WritableStream API events
イベント名 説明 引数
drain WritableStream の内部バッファが空になったことを
示すイベント
N/A
error エラーが発生したイベント エラーオブ
ジェクト
finish end() 後全てのデータの書き込みが完了したことを示
すイベント
N/A
pipe パイプがつながったことを示すイベント source
unpipe パイプが外されたことを示すイベント source
34. 一番簡単なサンプル(同期)
var dest = [];
var Writable = require(‘stream’).Writable;
Writable.prototype._write = function(chunk, encoding, cb) {
dest.push(chunk); // 同期
cb(null);
};
var wstream = new Writable();
var chunk = new Buffer(“abc”);
wstream.write(chunk, function(err) {
if (err) throw err;
console.log(“write finished”);
});
wstream.on (‘finish’, function() ,
console.log(‘dest=‘ + dest);
});
wstream.end();
生産者
実装者
書き込み
先
35. 36. 37. 同期書き込みサンプルの動き
複数書き込み
書き込み先
var dest = [];
wstream._write(chun
k, encoding, cb)
wstream.write(chunk1,
wcb1)
消費者
実装者
内部バッファ
書き込み完了
wstream.write(chunk2,
wcb2)
内部バッファ中で
待機中の書き込み
リクエストを実行
chunk2
38. 同期書き込みサンプルの動き
複数書き込み
書き込み先
var dest = [];
wstream._write(chun
k, encoding, cb)
wstream.write(chunk1,
wcb1)
消費者
実装者
内部バッファ
空
書き込み完了
wstream.write(chunk2,
wcb2)
内部バッファ中で
待機中の書き込み
リクエストを実行
wcb1(err)
wcb2(err)
drain
イベント
39. 40. var dest = [], chunks = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
var Writable = require('stream').Writable;
Writable.prototype._write = function(chunk, encoding, cb) {
setTimeout(function() {
dest.push(chunk); cb(null);
}, 1000);};
var wstream = new Writable();
var sWrite = func tion( c ) {
wstream.write(c, function(err) {
if (err) throw err;
console.log("write(" + c + ") completed");
});};
for(var i = 0; i < chunks.length; i++) sWrite(chunks[i]);
wstream.on('finish', function() { console.log('dest=' + dest); });
wstream.end();
非同期書き込みサンプル
41. 課題4
オレオレ パイプを作ろう
Readable
stream
hwm = 1
Writable
Stream
hwm = 1
src dst
ランダム
(MAX10秒)で
非同期読み
出し
ランダム
(MAX10秒)で
非同期書き
出し
_read
read/
write
_write
var src = *‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’+; var dst = [];
42. 43. 44. 45. 46. 47. 48. TransformStream API methods
TransformStream 返り値
実
装
者
用
_transform(chunk, encoding, cb) 変換処理を実装する関数。 write(chunk) さ
れたデータが chunk として渡されるので
chunk を実装者で好きに処理して
push(chunk) する。
終わったら cb() して chunk の処理が終
わったことを伝える。
_flush(cb) ストリームデータのデータ変換の最後に
追加の処理をしたいときに実装する。終
了したら cb() を実行。その直後に finish イ
ベントが発火する。
49. 簡単なサンプル(一文字シフ
ト)var Transform = require('stream').Transform;
Transform.prototype._transform = function(chunk, encoding, cb) {
for(var i = 0; i < chunk.length; i++) chunk[i]++;
this.push(chunk);
cb();
};
Transform.prototype._flush = function(cb) {
this.push(new Buffer('|saigo|'));
cb();
};
var tstream = new Transform();
var data = '';
tstream.on('readable', function() {
var b = tstream.read();
if (b) data += b;
});
tstream.on('end', function() {
console.log('transformed =' + data);
});
tstream.end(new Buffer('abc'));
変換
送り込み
完了通知
50. 51. 52. 53. 54. 55.