"synchronized"を使用する方法は明らかです。 しかし、私はいくつかのコアで動作するように設計されたシステム を作成し、そのファイルに同じmilisecondで何度も書き込んでいます。 同期を使用するとパフォーマンスが悪くなると思います。 私は、Javaのパイプクラスを使用することを考えていました(しかし、それが助けになるかどうかわからない) または各スレッドに別のファイルへの書き込みを依頼し、最後の結果を作成するためにこれらの書き込みを 収集するスレッドを追加しました。 私は、文章の順序は重要ではなく、とにかくナノタイマーでタイムスタンプ であることを言及する必要があります。 これらの2つのより良いアイデアは何ですか?他の提案がありますか?ありがとう。 複数のスレッドを同期して同じファイルに書き込むことも可能です
答えて
何らかの同期(例:単一のmutex)を使用することは、実装が非常に簡単です。
私は十分なRAMがあれば、ログプロデューサスレッドごとにいくつかの種類のキューを作成し、すべてのキューからラウンドロビン方式(またはそのようなもの)で読み込むログコンシューマスレッドを作成します。 。
あなたの質問に直接答えはありませんが、logbackプロジェクトには、異なるスレッドから同じファイルに書き込むための同期機能が組み込まれているため、必要に応じて使用するか、ソースコードを見てください。それは速度のために作られているので、私は実装が当然と考えられないと確信しています。
パフォーマンス上の問題がなくても、すべてのスレッドが同じファイルに書き込むことはできません。
私はこの問題(Log4jの前に戻って私自身のロギングを書く)があったとき、私はメモリ内に2つの固定サイズのバッファを作り、専用のコンシューマスレッドが他のバッファから読み込み、ファイルに書きました。このようにして、ライタースレッドは、バッファへのインデックスの取得とインクリメント時のみ、およびバッファがスワップされているときに同期化を行わなければならず、現在のバッファがいっぱいになったときにのみブロックされます。それは記憶集中的でしたが、速かったです。
Log4jやLogbackのようなロガーがどのように機能しているかを調べるには、この問題を解決する必要があります。
JMSを使用してください。異なるマシン上で実行されているすべてのプロセスが、ファイルに書き込む代わりにJMSメッセージを送信することがあります。メッセージを受信してファイルに書き込むキュー受信者を1つだけ作成します。 Log4Jには既にこの機能があります。JMSAppenderを参照してください。
- 1. 同じファイルに複数のスレッドを書き込む
- 2. 複数のスレッドから同じファイルの異なる部分に書き込むことは可能ですか?
- 3. スレッドとプロセスを使用して同じファイルに同時に書き込む
- 4. 複数のスレッドが同じブール値に書き込む
- 5. シェルループで同じファイルに書き込む
- 6. 複数のプロセスが同じファイルに書き込む(.net/c#)
- 7. ファイルを非同期で書き込む
- 8. forループで複数のサブプロセスを使用して同じファイルに書き込む
- 9. 異なるサーバー上の複数のプロデューサを同じトピックに書き込むことは可能ですか?
- 10. 複数のスレッドが同じ変数に同じ値を書き込んでも構いませんか?
- 11. 複数のスレッドが同時にファイルにデータを書き込むことはできますか?
- 12. 同じ時間に同じファイルに書き込む
- 13. 複数のシートを同じブックに書き込むPython pyexcelerateライブラリ?
- 14. Azure関数から非同期でファイルに書き込む
- 15. ノード内の同じファイルに非同期で書き込みして読み込む方法は?
- 16. Oracleを使用して同じファイルに書き込む
- 17. R foreachスレッドを同じログファイルに書き込む方法
- 18. 複数のファイルに同じキーのレコードを書き込む方法(カスタムパーティショナー)
- 19. 不可能 - 複数行の出力をファイルに書き込む
- 20. Javaで複数のスレッドが同時にファイルにランダムなバイトを書き込む[ちょっとしたアドバイス]
- 21. 複数のスレッドで書き込みファイルを読み込む
- 22. 複数のアプリケーションをサポートする.NETのロギングフレームワークで、同じローリングログファイルに書き込むことはできますか?
- 23. HTTPリクエストコンテンツをファイルに非同期で書き込む方法は?
- 24. 同じ実行可能ファイルにSqliteデータベースファイルを埋め込む
- 25. C++ unixでファイルに非同期で書き込む
- 26. PrintWriterとDataOutputStreamを使用してJavaの同じファイルに書き込む
- 27. データバインディングで同じ複数のインクルードを共通のonclicklistenerに書き込む方法
- 28. 出力をTalend ETL内の同じxmlファイルに書き込む
- 29. Swift Realm書き込みメソッドが同期スレッドまたは非同期スレッド
- 30. Excel VBAで複数のセルを同時に書き込む
どのスピードのスピード、スループット、またはレイテンシを指定する必要があります。 1msに10k m/sのメッセージを書く必要がありますか?また、ディスクへの書き込みの信頼性を気にしている場合(プロセスクラッシュ時の遅延書き込みを緩和できるかどうか) – DaveC