2017-05-17 15 views
0

非常に大きなデータセットを処理する必要のあるプログラムを作成しました。ハイエンドマシンで複数のスレッドで実行する予定です。Clojure:複数のスレッドを作成して管理する

私はClojureの初心者であり、処分時に無数のツールで失われています - 代理人、先物、core.async(およびQuartzite?)。私はこの仕事に最も適しているものを知りたいと思います。私はいくつかのデータを変換し、データベースに格納する機能を持っている

  1. 以下は、私の状況を説明しています。

  2. 上記の関数の引数は、Redisのセットからポップされます。
  3. Redisセットに値がある限り、関数をいくつかの別々のスレッドで実行します。あなたが解決する良い embarrassingly parallel問題 を有することができるよう

答えて

1

が鳴ります。その場合は、最初のデータを処理するトップレベル関数に 処理をコーディングするだけで簡単に開始することができます。 これが機能したら、 mapにラップして、 のすべてのデータを順番に(シリアルに、1度に1つずつ)処理します。

あなたのデータセットの項目数がわずかである場合は、より多くの問題に取り掛かりたいかもしれません。これにより、テストがスムーズになり、 の処理速度が向上します。

あなたがmap作業をしたら、それはちょうどそれがpmapを 作るためにあなたのコードにp (パラレル)を追加してみましょう。これは、あなたの マシンを加熱するための非常に役立つ です。 Hereは です。pmapが使用するスレッド数についての議論です。


上記は最も簡単な方法です。 をより細かく制御する必要がある場合は、 this concurrency screencastが使用例を で調べます。

1

あなたの問題の詳細を知っていなくても正確であることは難しいです。あなたが言及するようにいくつかの選択肢があります:

  • プレーンJavaスレッド&スレッドプール。問題が既存のJavaソリューションに類似している場合は、これが最も簡単かもしれません。
  • 簡易Clojureスレッディングfutureなど。 futureでスレッドをキックオフし、結果をpromiseにするのはとても簡単です。
  • mappmap(パラレルマップ)に置き換えます。これは、主に地図/縮小指向の単純な場合に役立ちます。
  • The Claypoole library:マルチスレッドを簡単かつ簡単にするツールがたくさんあります。their GitHub projectClojure/West talk.
3

を参照してください。簡単にするために、先物は勝てません。彼らは新しいスレッドを作成し、そこから値を返します。しかし、しばしば、より細かい制御が必要です。

core.asyncライブラリは、パイプライン経由で並列処理をサポートしています(下記参照)。また、自動バックプレッシャも備えています。あなたは誰も仕事を飢えさせたり、あまりにも負担をかけたりしないように、データの流れを制御する方法が必要です。 core.asyncチャンネルは境界を接する必要があり、これはこの問題に役立ちます。また、それはあなたの問題のかなり論理的なモデルです。ソースから値をとり、transducer?を使用して変換したもの(parallelism)を与えて、その結果をデータベースに入れます。

また、Javaの優れたj.u.concurrentライブラリを使用した手動ルートに進むこともできます。低レベルのプリミティブとthread poolsthread managementツールがあります。これらのすべては、クロージャー内でアクセス可能です。

デザインの観点から見ると、より多くのCPUバウンドまたはI/Oバウンドになっています。これは、redisからのパラレル読取りとデータベースへの書込みを実行するかどうかなどの決定に影響します。 CPUにバインドされているためにボトルネックが計算されていると、読み込みを並列化したり、データベースに書き込んだりすることはあまり意味がありません。これらは考慮すべき種類のものです。

(1)clojureの/ javaの並行性メカニズムに精通していること、(2)この問題に対するあなたのアプローチ(つまり、どのようにこの問題に近づくでしょうか? ?を使用して)。 #2を解くと、私が上で述べたどのツールを使うべきか、それらを使う方法についてのより良い考えが得られます。

関連する問題