Recommended
PDF
PDF
Query Optimization with MySQL 8.0 and MariaDB 10.3: The Basics
PDF
PPTX
re:Invent 2022 DAT326 Deep dive into Amazon Aurora and its innovations
PDF
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
PPTX
PostgreSQL Database Slides
PPTX
LinkML presentation to Yosemite Group
PDF
Run Apache Spark on Kubernetes in Large Scale_ Challenges and Solutions-2.pdf
PDF
[Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱
PDF
Oracle GoldenGate and Apache Kafka: A Deep Dive Into Real-Time Data Streaming
PDF
Oracle Database SQL Tuning Concept
PDF
Google BigQuery for Everyday Developer
PDF
Linked Data의 RDF 어휘 이해하고 체험하기 - FOAF, SIOC, SKOS를 중심으로 -
PDF
All Oracle-dba-interview-questions
PDF
Data Warehouse on Kubernetes: lessons from Clickhouse Operator
PDF
Oracle Database Management - Backup/Recovery
PDF
PDF
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
PDF
LODAC 2017 Linked Open Data Workshop
PPTX
PDF
Splunkで実践するKubernetesの運用監視とオブザーバビリティ
PPTX
Ontology Access Kit_ Workshop Intro Slides.pptx
PDF
Spring Boot and Microservices
PDF
Wars of MySQL Cluster ( InnoDB Cluster VS Galera )
PPTX
PPTX
The Semantic Web #9 - Web Ontology Language (OWL)
PDF
도서관 Linked Open Data의 필요성
PDF
Apache Druid®: A Dance of Distributed Processes
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
More Related Content
PDF
PDF
Query Optimization with MySQL 8.0 and MariaDB 10.3: The Basics
PDF
PPTX
re:Invent 2022 DAT326 Deep dive into Amazon Aurora and its innovations
PDF
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
PPTX
PostgreSQL Database Slides
PPTX
LinkML presentation to Yosemite Group
PDF
Run Apache Spark on Kubernetes in Large Scale_ Challenges and Solutions-2.pdf
What's hot
PDF
[Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱
PDF
Oracle GoldenGate and Apache Kafka: A Deep Dive Into Real-Time Data Streaming
PDF
Oracle Database SQL Tuning Concept
PDF
Google BigQuery for Everyday Developer
PDF
Linked Data의 RDF 어휘 이해하고 체험하기 - FOAF, SIOC, SKOS를 중심으로 -
PDF
All Oracle-dba-interview-questions
PDF
Data Warehouse on Kubernetes: lessons from Clickhouse Operator
PDF
Oracle Database Management - Backup/Recovery
PDF
PDF
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
PDF
LODAC 2017 Linked Open Data Workshop
PPTX
PDF
Splunkで実践するKubernetesの運用監視とオブザーバビリティ
PPTX
Ontology Access Kit_ Workshop Intro Slides.pptx
PDF
Spring Boot and Microservices
PDF
Wars of MySQL Cluster ( InnoDB Cluster VS Galera )
PPTX
PPTX
The Semantic Web #9 - Web Ontology Language (OWL)
PDF
도서관 Linked Open Data의 필요성
PDF
Apache Druid®: A Dance of Distributed Processes
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
Continuation with Boost.Context
PDF
Javaセキュアコーディングセミナー東京第3回講義
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
C16 45分でわかるPostgreSQLの仕組み by 山田努
PDF
PDF
PDF
20101018 JJUG CCC10 WindowsAzure
PDF
B lack jumbodog 運転と改造のすすめ
PDF
PDF
Azure Stack HCI - パフォーマンス履歴 と Azure Monitor
PDF
PPTX
PDF
2011.09.18 v7から始めるunix まとめ
PDF
PDF
Reactive Extensionsで非同期処理を簡単に
PPT
PPTX
Distributed processwithapex&flow lowcode
PDF
KEY
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.