0

カスケード ドキュメントの章 5.2 関数を読んでいますが、次のコードで何が起こるのだろうかと思います。マルチスレッド環境で正常に動作するはずですか? より一般的な質問は、関数をマルチスレッド化できるかどうかです。私が知っているように、単一のマッパーはシングルスレッドです。

具体的には、そのようなコードをテストしましたが、これはスレッドセーフではないようです。(39) ページのドキュメントを正しく理解していない可能性があります。

public class NotThreadSafeObject{ 
 ...
 public void doSomething(){
       // update state
 }
 public String getValue(){
       // returns value from state 
 }
public class SomeFunction extends BaseOperation<Tuple> implements Function<Tuple>
 {
    // constructors
   @Override
   public void prepare( FlowProcess flowProcess, OperationCall<Tuple> call )
   {
   // create a reusable Object with state of size 1
    call.setContext( new NotThreadSafeObject() );
   }

   public void operate( FlowProcess flowProcess, FunctionCall<Tuple> call )
   {
     // ...
     NotThreadSafeObject obj = call.getContext();
     obj.doSomething(); 
     Tuple tup = new Tuple();
     tup.set(0,obj.getValue());  
     call.getOutputCollector().add(tup);
   }

   @Override
   public void cleanup( FlowProcess flowProcess, OperationCall<Tuple> call )
   {
      call.setContext( null );
   }
}
4

1 に答える 1

1

カスケードのドキュメントに基づいて、これは正常に機能するはずであり、実際には非集計操作でコンテキストを使用する主な理由です。

于 2013-11-20T01:56:46.337 に答える