1

NoFlo では、次のようなコンポーネントに出くわすことがよくあります。

noflo = require 'noflo'

class Foo extends noflo.AsyncComponent
  constructor: ->
    @inPorts = new noflo.InPorts
      main:
        datatype: 'int'
        description: 'Main async input'
        required: true
      sup1:
        datatype: 'string'
        description: 'Supplementary input #1'
        required: true
      sup2:
        datatype: 'int'
        description: 'Supplementary input #2'
        required: true
    @outPorts = new noflo.OutPorts
      out:
        datatype: 'object'
        description: 'Result object'
      error:
        datatype: 'object'

    @sup1 = null
    @sup2 = null

    @inPorts.sup1.on 'data', (@sup1) =>
    @inPorts.sup2.on 'data', (@sup2) =>

    super 'main', 'out'

  doAsync: (main, callback) ->
    unless @sup1 and @sup2
      return callback new Error "Supplementary data missing"

    # Combine data received from different sources
    result =
      main: main
      sup1: @sup1
      sup2: @sup2

    # Reset state until next iteration
    @sup1 = null
    @sup2 = null

    # Send the result
    @outPorts.out.send result
    @outPorts.out.disconnect()

    callback()

exports.getComponent = -> new Foo

ネットワークの大部分が非同期コンポーネントで構成されているにもかかわらず、3 つの入力接続すべてが何らかの方法で同期されていると想定しています。次の状況を考えてみましょう:が来るのをFoo待ってパケットを受信しますが、次のパケットが到着し、それを next と結合する必要がありますが、前のパケットが来るのをまだ待っています。結果は、より多くの、または高いデータスループットで完全に混乱します。mainsup1sup2sup1mainmain

NoFlo 非同期コンポーネントにはデータ競合保護の手段がありますか、それともすべてコンポーネントの設計者次第ですか?

ここには、入力の同期と内部状態の維持という 2 つの側面があります。doAsync()内部状態は、Node.js がマルチスレッド化されておらず、前のハンドラーが終了するまで状態変数にアクセスしようとしないという事実によって、多かれ少なかれ保護されています。しかし、入力の同期はまだ問題です。

4

2 に答える 2

0

最近のバージョンの NoFlo では、noflo.helpers.WirePattern を使用し、グループを使用して同期することをお勧めします。

于 2014-11-24T17:45:32.557 に答える
0

NoFlo v0.5.1 で判明したように、データ競合に対する組み込みの補助機能はなく、コンポーネントの設計者は自分でそれを気にする必要があります。

非同期コンポーネントの場合:

  1. 複数の入力ポートからのデータが必要な場合は、処理する前にすべてのポートからデータが到着していることを確認してください。コンポーネントとポート ツールボックスを参照してください。
  2. コンポーネントの状態を反復ごとにリセットして、「メモリ」の副作用が発生しないようにします。
  3. コンポーネントの内部状態をデータ競合から保護するには、コンポーネントの前に Throttle コンポーネントを配置し、コンポーネントの LOAD 出力ポートを Throttle の LOAD 入力ポートに接続します。
于 2014-05-20T17:50:25.427 に答える