2017-06-29 4 views
0

web3jライブラリを使用して、Ethereumブロックチェーン用にJavaで負荷テストアプリケーションを開発しています。このライブラリから使用される特定の関数は、トランザクションを非同期に送信し、Futureオブジェクトを返します。そのライブラリは、アプリケーションの開発のために私が最初に必要としていた多くの機能を提供します。しかし、負荷テストアプリケーションを設計して再設計した後、私は問題に気付きました。 N Futuresを一度に展開することしかできません。ここで、Nはマシン上の使用可能なコアの数です。各Javaの将来はコアの寿命を制御します

これは非常に効率的ではありません。トランザクションごとにブロックチェーンへの統合に最低10秒かかるため、Futureはバックグラウンドで継続的に実行されています。それらがRxJavaのオブザーバブルに変換された場合(RxJavaのfrom()関数を使用して)、バックグラウンドで引き続き実行され、データが利用可能かどうかをチェックしたり、一度に多くのチェックをオーバーレイできます。たとえば、チェックに0.1秒かかり、1秒に1回チェックする必要がある場合は、1つではなく1つのコアで10のチェックを実行することができます.FeureをObservableに変換すると、 Web3jの内部コードの多くをリファクタリングすることを伴わない別の方法がありますか?

原因は、Async.javaファイルに含まれるこの機能です。この関数は、トランザクションを送信する内部のweb3j関数によって呼び出されます。

public static <T> CompletableFuture<T> run(Callable<T> callable) { 
    CompletableFuture<T> result = new CompletableFuture<>(); 
    CompletableFuture.runAsync(() -> { 
     // we need to explicityly catch any exceptions, 
     // otherwise they will be silently discarded 
     try { 
      result.complete(callable.call()); 
     } catch (Throwable e) { 
      result.completeExceptionally(e); 
     } 
    }); 
    return result; 
} 
+0

"N Futuresを一度に展開することができます。ここで、Nはマシン上の使用可能なコアの数です。" - それはどういう意味ですか? N + 1番目の未来を "展開"しようとすると、どういうことが起こりますか?私は、どこかで解読される必要のある誤解があると思う。 –

+0

N + 1th Futureを展開すると、現在実行中のFuturesのいずれかが終了するまで実行されません。 – aj1996

+0

私たちが多くの助けになる前に、これを実証するコードの[Minimal、Complete、and Verifiable example](http://stackoverflow.com/help/mcve)を見る必要があります。私の腸は、これはあなたの 'ExecutorService'内のスレッドの数と関係があると言いますが、コードなしではあなたに適切なアドバイスを与えることはできません。 –

答えて

2

まず第一に、あなたのタスクは、結果を返すことを期待するならば、あなたはむしろrunAsyncよりもsupplyAsync使用する必要があります。

しかし、あなたが実行するための唯一のタスクとrunAsyncまたはsupplyAsyncを呼び出すときにあなたの質問のより本質的な部分に、それはJVM全体ForkJoinPool、あなたが推測しているとして、それが利用できるように多くのスレッドを持っている上で実行されますあなたのマシンにコアがあるように。しかし、ExecutorServiceを選択することもできます。これは、コアよりスレッド数が多い場合があります。

ExecutorService executor = Executors.newFixedThreadPool(NUM_DESIRED_THREADS); 

CompletableFuture<T> result = CompletableFuture.supplyAsync(callable, executor); 

上記のコードは、できるだけ多くNUM_DESIRED_THREADSなどのタスクを同時に実行できるようになります。

+0

これは完全に機能しました。お手伝いありがとう。 – aj1996