1

関数があるとしますBlackBox。APIは次のようなものです(|実際、パイプはどこにありますか):

inputStream | BlackBox | outputStream

ただし、BlackBox実際には a のラッパーrequire('child_process').spawnなので、実際には次のようになります。

inputStream | BlackBox.Writable -> proc.stdin -> proc.stdout -> BlackBox.Readable | outputStream

でこれを簡単に実行できますがstreams1、それがどのように優れているかを理解したいですstreams2。したがって、これまでのところ次のコードがあります。

var Duplex = require('stream').Duplex
var spawn = require('child_process').spawn
var util = require('util')

util.inherits(BlackBox, Duplex)

function BlackBox () {
  Duplex.call(this)

  // Example process
  this.proc = spawn('convert', ['-', ':-'])

  var that = this
  this.proc.stdout.on('end', function () {
    that.push(null)
  })
}

BlackBox.prototype._write = function (chunk, encoding, callback) {
  return this.proc.stdin.write(chunk, encoding, callback)
}

BlackBox.prototype.end = function (chunk, encoding, callback) {
  return this.proc.stdin.end(chunk, encoding, callback)
}

BlackBox.prototype._read = function (size) {
  var that = this

  this.proc.stdout.on('readable', function () {
    var chunk = this.read(size)
    if (chunk === null)
      that.push('')
    else
      that.push(chunk)
  })
}

私はここで何か悪いことをしていますか?

私の主な関心事は、のドキュメントからの次の抜粋readable._read(size)です。

データが利用可能になったら、readable.push(chunk) を呼び出して読み取りキューに入れます。push が false を返す場合は、読むのをやめるべきです。_read が再度呼び出されたら、さらにデータのプッシュを開始する必要があります。

どうすれば「読むのをやめる」ことができますか?

明確にするために、背圧とスロットリングを処理する必要があります。

4

1 に答える 1