在NoFlo我經常碰到的部件是這樣的: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
等待main
來接收sup1
和sup2
數據包,但接下來sup1
數據包到達應與下一個main
組合,而仍然等待前面main
來。結果將會導致更多或更高的數據吞吐量。
NoFlo異步組件是否有任何數據競爭保護手段,或者完全取決於組件設計者?
這裏有兩個問題:同步輸入和維護內部狀態。由於這個事實,內部狀態或多或少受到保護。Node.js不是多線程的,並且除非以前的doAsync()
處理程序完成,否則什麼都不會嘗試訪問狀態變量。但同步輸入仍然是一個問題。