2014-05-14 31 views
1

在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來接收sup1sup2數據包,但接下來sup1數據包到達應與下一個main組合,而仍然等待前面main來。結果將會導致更多或更高的數據吞吐量。

NoFlo異步組件是否有任何數據競爭保護手段,或者完全取決於組件設計者?

這裏有兩個問題:同步輸入和維護內部狀態。由於這個事實,內部狀態或多或少受到保護。Node.js不是多線程的,並且除非以前的doAsync()處理程序完成,否則什麼都不會嘗試訪問狀態變量。但同步輸入仍然是一個問題。

回答

0

事實證明,對於NoFlo v0.5.1,沒有針對數據競賽的內置輔助功能,組件設計人員必須自己關心它。

對於異步組件,這意味着:

  1. 如果從多個inports數據是必需的,請確保它從處理前所有端口到達。見Components & Ports toolbox
  2. 將組件的狀態從迭代重置爲迭代以確保不會發生「內存」副作用。
  3. 通過在Throttle組件的前面以及使用Throttle的LOAD inport連接組件的LOAD outport來保護組件的內部狀態不受數據競爭影響。
0

對於最新版本的NoFlo,推薦的方法是使用noflo.helpers.WirePattern,並使用組進行同步。