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 と結合する必要がありますが、前のパケットが来るのをまだ待っています。結果は、より多くの、または高いデータスループットで完全に混乱します。main
sup1
sup2
sup1
main
main
NoFlo 非同期コンポーネントにはデータ競合保護の手段がありますか、それともすべてコンポーネントの設計者次第ですか?
ここには、入力の同期と内部状態の維持という 2 つの側面があります。doAsync()
内部状態は、Node.js がマルチスレッド化されておらず、前のハンドラーが終了するまで状態変数にアクセスしようとしないという事実によって、多かれ少なかれ保護されています。しかし、入力の同期はまだ問題です。