35

プログラムに複数のゴルーチンがあり、それぞれがfmt.Println明示的な同期なしでを呼び出します。これは安全ですか(つまり、データが破損することなく各行が別々に表示されますか)、または印刷を処理するために同期を使用して別のゴルーチンを作成する必要がありますか?

4

3 に答える 3

23

いいえ、トラブルに見舞われないこともありますが、安全ではありません。IIRC、fmtパッケージは安全側にしようとしているので、おそらく何らかの混合が発生する可能性がありますが、プロセスがクラッシュしないことを願っています。

これは、より普遍的なGoドキュメントルールのインスタンスです。特に指定されていない限り、またはコンテキストから明らかな場合を除いて、同時アクセスに対して安全ではありません。

いくつかの小さな初期設定でログパッケージを使用して、fmt.Print*機能の優れたサブセットの安全なバージョンを作成できます。

于 2013-02-04T20:06:03.373 に答える
13

ここに見られるように、すべてfmtがフォールバックします。その周りにロックがないため、すべてがの実装にフォールバックします。まだロックがないため(少なくともStdoutの場合)、出力が混合されないという保証はありません。w.Write()Write()

グローバルログルーチンを使用することをお勧めします。

さらに、単にデータをログに記録したい場合はlog、出力へのアクセスを適切にロックするパッケージを使用してください。参照用の実装を参照してください。

于 2013-02-04T20:03:50.890 に答える
11

一般的なメソッド(fmt.printLine)は安全ではありません。ただし、ある方法があります。

log.Loggerは「非常に安全」です:https ://golang.org/pkg/log/#Logger

このようなものは、どのgoルーチンからでも安全に使用できるstdoutロガーを作成します。

logger := log.New(os.Stdout, "", 0)

于 2017-04-10T15:38:00.487 に答える