11

前に関連する質問をしたことがあります。

ocaml のスレッディングがいかに「悪い」ものであっても、実際のスレッディングができると言っているライブラリがあることに気付きました。

たとえば、Lwt

Lwt は新しい選択肢を提供します。非常に軽量な協調スレッドを提供します。スレッドの「起動」は非常に高速な操作であり、新しいスタックや新しいプロセスなどは必要ありません。さらに、コンテキストの切り替えは非常に高速です。実際、システムコールごとにスレッドを起動するのはとても簡単です。また、協調スレッドを構成すると、高度に非同期なプログラムを作成できるようになります。

また、私が正しければ、aync_coreJane Streetも同様のものを提供します。


しかし、私はかなり混乱しています。のようなスレッドを実行Lwtまたは提供しますか?aync_coreJava threading

それらを使用する場合、複数の CPU を使用できますか?

OCaml で「本当のスレッド」(Java のように) を取得するにはどうすればよいですか?


編集

私はまだ混乱しています。

シナリオを追加しましょう。

サーバー ( 16 cpu cores) とサーバー アプリケーションがあります。

サーバー アプリケーションの機能は次のとおりです。

  • リクエストに耳を傾けます
  • リクエストごとに、計算タスクを開始します (完了するまでに 2 分かかるとしましょう)
  • 各タスクが終了すると、タスクは結果をメインに返すか、結果を直接クライアントに送り返します。

Java では、非常に簡単です。スレッド プールを作成し、リクエストごとにそのプールにスレッドを作成します。そのスレッドは計算タスクを実行します。これは Java で成熟しており、16 個の CPU コアを利用できます。私は正しいですか?

だから私の質問は: OCamlで同じことをすることはできますか?

4

2 に答える 2

16

あなたが引用した並列化されたサーバーの例は、fork. これは何十年も OCaml で実行可能でした。必要に応じて、マシンのすべてのコアを使用して、ほぼ線形のスピードアップを実現できます。

標準ライブラリの単純なプリミティブを使用してこれを行うには、オンライン ブック「OCaml での Unix システム プログラミング」(2003 年に最初にリリースされた) のこの章、および/またはオンライン ブック「OCaml を使用したアプリケーションの開発」(最初のリリース) のこの章を参照してください。 2000年発売)。

通常のクライアント/サーバー設計の直接ヘルパーから低レベルのマルチプロセス通信ライブラリまで、多くのものを提供する rafix で言及されている Gerd Stolpmann のOCamlnetライブラリなどの高レベル ライブラリを使用することもできます。ドキュメントを参照してください。

ライブラリParmapも興味深いですが、おそらく少し異なるユース ケース (同じ関数で並列に処理したい大量のデータ配列を同時に利用できる場合) の場合があります。Array.mapまたはList.map(または)のfold計算を並列化します。

于 2013-05-15T13:15:55.280 に答える
11

実際の (プリエンプティブな) スレッド化に最も近いものは、組み込みのスレッド化ライブラリです。つまり、プログラミング モデルは同じですが、2 つの重要な違いがあります。

  • OCaml のネイティブ スレッドは、Java のように軽量ではありません。
  • 一度に実行されるスレッドは 1 つだけなので、複数のプロセスを利用することはできません。

これにより、OCaml のスレッドは同時実行または並列処理のいずれかに対してかなり不適切なソリューションになり、一般に人々はそれらの使用を避けます。しかし、それらにはまだ用途があります。

Lwt と Async は非常に似ており、異なるフレーバーのスレッド化 (協調スタイル) を提供します。協調スレッドは、スレッド間のコンテキスト切り替えがコード内で明示的であり、ブロッキング呼び出しが型シグネチャから常に明らかであるという点で、プリエンプティブ スレッドとは異なります。提供されている協調スレッドは非常に安価であるため、同時実行には非常に適していますが、(OCaml のランタイムの制限により) 並列処理には役立ちません。

協調スレッド化の優れた紹介については、http: //janestreet.github.io/guide-async.htmlを参照してください。

編集:あなたの特定のシナリオでは、Parmap を使用します。タスクがあなたの例のように計算集約的である場合、parmap からプロセスを開始するオーバーヘッドは無視できるはずです。

于 2013-05-15T10:52:05.297 に答える