プログラムに複数のゴルーチンがあり、それぞれがfmt.Println
明示的な同期なしでを呼び出します。これは安全ですか(つまり、データが破損することなく各行が別々に表示されますか)、または印刷を処理するために同期を使用して別のゴルーチンを作成する必要がありますか?
3 に答える
いいえ、トラブルに見舞われないこともありますが、安全ではありません。IIRC、fmtパッケージは安全側にしようとしているので、おそらく何らかの混合が発生する可能性がありますが、プロセスがクラッシュしないことを願っています。
これは、より普遍的なGoドキュメントルールのインスタンスです。特に指定されていない限り、またはコンテキストから明らかな場合を除いて、同時アクセスに対して安全ではありません。
いくつかの小さな初期設定でログパッケージを使用して、fmt.Print*機能の優れたサブセットの安全なバージョンを作成できます。
ここに見られるように、すべてfmt
がフォールバックします。その周りにロックがないため、すべてがの実装にフォールバックします。まだロックがないため(少なくともStdoutの場合)、出力が混合されないという保証はありません。w.Write()
Write()
グローバルログルーチンを使用することをお勧めします。
さらに、単にデータをログに記録したい場合はlog
、出力へのアクセスを適切にロックするパッケージを使用してください。参照用の実装を参照してください。
一般的なメソッド(fmt.printLine)は安全ではありません。ただし、ある方法があります。
log.Loggerは「非常に安全」です:https ://golang.org/pkg/log/#Logger
このようなものは、どのgoルーチンからでも安全に使用できるstdoutロガーを作成します。
logger := log.New(os.Stdout, "", 0)