web-dev-qa-db-ja.com

Clojureでcore.asyncを使用するのはいつですか?

Clojureのcore.asyncライブラリをいつ使用する必要がありますか?どのような種類のアプリケーションがそのようなasyncのものを必要としますか?

Clojureは、refsagentsatomsthread locals/varsのような4つの基本的な可変モデルを提供します。これらの可変参照は、core.asyncが提供するものを簡単に提供することはできませんか?

非同期プログラミングの実際のユースケースを提供できますか?

問題を見つけたときにクリックして「これはcore.asyncを適用する必要がある場所です」と言うように、どうすればそれを理解できますか? )?

また、シングルスレッド環境であるClojureScriptcore.asyncを使用できますが、(コールバック地獄を回避する以外に)そこにある利点は何ですか?

9

あなたはこれを読みたいと思うかもしれません:

Core.asyncの最適な使用例はClojureScriptです。これにより、マルチスレッドプログラミングをシミュレートし、Callback Hellを回避できます。

JVM Clojureでは、core.asyncは、(軽量の)生産者/消費者アーキテクチャーが必要な場合にも便利です。もちろん、いつでも native Java queues を使用することもできます。

8
Alan Thompson

プログラミング界では、「非同期」という言葉に関連する2つの一般的な意味があることを指摘することが重要です。

  1. 非同期メッセージング:コンポーネントがコンシューマーからの応答を期待せずに、多くの場合、コンシューマーが誰であるかさえ知らずに(キューを介して)メッセージを送信するシステム
  2. ノンブロッキング(別名イベントドリブン)I/O:高価な計算リソース(スレッド、コア)をブロックしないように構造化されたプログラム、...)応答を待っている間。このようなシステムを処理するには、抽象化のレベルが異なるいくつかのアプローチがあります。コールバックベースのAPI(低レベル、に基づいているため管理が難しい副作用)、Promise/Futures/Deferreds(まだ持っていない値の表現、値ベースであるためより管理しやすい)、 グリーンスレッド(通常の制御フローをエミュレートするが安価な「論理」スレッド)

core.asyncは1(キューを介した非同期メッセージング)に対して非常に意見が高く、グリーンスレッドを実装するためのマクロ(goマクロ)を提供します。

私の経験から、非ブロッキングだけが必要な場合は、個人的には Manifold から始めることをお勧めします。これにより、ユースケースについての仮定が少なくなり、次に core.async を使用します。それが不十分なより高度なユースケース。両方のライブラリが適切に相互運用できることに注意してください。

5

Core.asyncは、Clojureでのプロデューサー/コンシューマーの相互作用を調整するのに役立つプログラミングのようなソケットのビルディングブロックを提供します。 Core.asyncの軽量スレッド(goブロック)を使用すると、ブラウザーでコールバックを使用する代わりに、チャネルから読み取る命令型のコードを記述できます。 JVMでは、軽量スレッドを使用すると、フルCPUスレッドを利用できます。

フルスタックのCLJ/CLJSプロデューサー/コンシューマーCore.asyncチャットルームの例をここで見ることができます: https://github.com/briangorman/hablamos

Core.asyncのもう1つのキラー機能は、パイプライン機能です。多くの場合、データ処理では、最初の処理段階でCPU時間の大部分を占めますが、後の段階では、削減にかかる時間は大幅に少なくなります。非同期パイプライン機能を使用すると、処理をチャネルに分割して、パイプラインに並列化を追加できます。 Core.asyncチャネルはトランスデューサーで動作するため、チャネルは他の言語でうまく機能するようになりました。

3
Brian G

これは、JVMでの副作用の並列処理のきめ細かい構成可能な制御に役立つと思います。

例えば以下がCassandraからの読み取りを実行し、async/chanを返す場合:

(arche.async/execute connection :key {:values {:id "1"}})

次に、以下は一連の実行を並列で実行します。この並列処理は構成可能であり、結果は順番に返されます。

(async/pipeline-async
    n-parallelism
    out
    #(arche/execute connection :key {:values %1 :channel %2})
    (async/to-chan [{:id "1"} {:id "2"} {:id "3"} ... ]))

おそらく私のニッチにかなり特別ですが、あなたはその考えを理解します。

3
Derek Troy-West