2011-12-07 16 views
8

私はClojureで書かれたマルチスレッドアプリケーションを持っています。複数のスレッドがSTDOUTに書き込むときにコンソールのテキストが正しく表示されるという問題があります。どのようにClojureでこれを正しく行うことができるので、ラインはインターレースされていませんか?これは何らかの別のIOエージェントを必要とすると思いますが、どうやってそれを行うのか本当に分かりません。Clojureの標準出力の同期

答えて

9

私は、これははい、それは動作するはず別々のIOエージェント

のいくつかの種類を伴うだろうと思います。エージェント(def printer (agent nil))を作成し、適切なprintステートメント((send printer #(println msg))など)で呼び出します。メッセージはキューに入れられ、一度に1つずつ(非同期に)実行されます。

ログの目的のために、フードの下でエージェントを使用するtools.loggingを見ることもできます。

+0

この機能は、別の機能プロキシ経由でエージェントに印刷ジョブを送信する必要があることを除きます。何らかの理由でprintlnをエージェントに直接送信することはできません。 – bvk256

+0

ClojureのWebサイトの[この記事](http://clojure.org/agents)には、次のように書かれています。 "別のエージェント**またはエージェント**からエージェントにディスパッチされたアクションは、 **他のソースから**同じエージェントに配信されたアクションで**インターリーブされる可能性があります**。 "**複数スレッド**がSTDOUTに書き込む"ときに問題が残ることはありますか? –

関連する問題