リクエストの処理の一部として、ログに次のコードを使用しています。このコードはどこでも何度も見られます。複数の並列呼び出しを行うと、このコードが原因でデッドロックが発生します。
(defn log [msg & vals]
(let [line (apply format msg vals)]
(locking System/out (println line))))
ここで何がうまくいかないのか誰でも知っています。
ありがとう
リクエストの処理の一部として、ログに次のコードを使用しています。このコードはどこでも何度も見られます。複数の並列呼び出しを行うと、このコードが原因でデッドロックが発生します。
(defn log [msg & vals]
(let [line (apply format msg vals)]
(locking System/out (println line))))
ここで何がうまくいかないのか誰でも知っています。
ありがとう
ロックのドキュメント から:
x のモニターを保持しながら、暗黙の do で exprs を実行します。すべての状況で x のモニターを解放します。
System.out の監視を保留していて、複数の並列呼び出しを取得すると、デッドロック例外が発生します。
「すべての状況で x のモニターを解放する」ということは、私には明確ではありません。
実験のために、(ロック) 関数の呼び出しを削除して、システムが引き続き機能するかどうかを確認してください。