チャンネルを開いたままにしても問題ありませんか?


160

状態を確認しない場合は、Goチャネルを永久に開いたまま(チャネルを決して閉じない)にしても問題ありませんか?それはメモリリークにつながりますか?次のコードは大丈夫ですか?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}

回答:


236

Goチャネルを永久に開いたままにし、決して閉じないでください。チャネルが使用されなくなると、ガベージコレクションされます。

レシーバーがクローズを探している場合にのみチャネルをクローズする必要があることに注意してください。チャネルを閉じることは、チャネル上の制御信号であり、後続のデータがないことを示します。

設計上の質問:チャネルのクローズ


3
リンクの応答に同意するかどうかはわかりません。2GBの範囲でメモリリークが発生しました。間欠泉を追加するとすぐに間欠泉が細流になった。
Richard

9
@Richard:スレッド全体を注意深く読んでください。Go gcの作成者とgccgosayチャネルcloseの作成者は、を探している場合を除き、必要ありませんclose。それは権威あるアドバイスです。
peterSO 2013

6
@peterSO、そうかもしれませんが、私は私が見たものを知っており、それは私が報告したものなので、私を解任しないでください。
リチャード

1
バッファチャネルがある場合は、メッセージを追加するときにメモリを使用する必要があります。ただし、チャネルがバッファリングされていないか、何も追加されていない場合、メモリ使用量は増加しません。
metakeule 2014

これについてはどうですか:groups.google.com/forum / # ! topic / golang-nuts / bfuwmhbZHYw
Kamil Dziedzic 2014

31

はい、チャンネルを開いたままにしても問題ありません。通り、外出先プログラミング言語の本は次のように述べました。

使い終わったら、すべてのチャンネルを閉じる必要はありません。すべてのデータが送信されたことを受信側のゴルーチンに伝えることが重要な場合にのみ、チャネルを閉じる必要があります。ガベージコレクターが到達不可能であると判断したチャネルは、閉じられているかどうかに関係なく、そのリソースを再利用します。(これを開いているファイルの閉じる操作と混同しないでください。終了したら、すべてのファイルに対してCloseメソッドを呼び出すことが重要 です。)


7

はい、チャンネルを開いたままにしても問題ありません。実際、これは一般的なことです。開いているチャネルは、チャネルオブジェクトへの参照を構成しないため、ガベージコレクションの対象となりません。


1

Goチャネルを使用する一般的な原則の1つは、チャネルに複数の同時送信者がいる場合、受信側からチャネルを閉じないでください。チャネルを閉じないでください。

上記の回答で明確に述べたように、クリーンアップのマークが付けられると、すべてのチャネルが最終的にGCされるため、チャネルを閉じないでおくことは問題ありgcません。明示的に閉じられていません。

また、以下の記事これこの番組の様々な方法が1の場合にチャネルを閉鎖する:N、N:1又はM:N(送信者:受信機)


-5

Goはガベージコレクションされるため、何も「解放」する必要はありません。

チャネルを閉じる可能性がありますが、それは主に-close(channel)として使用されます-そのチャネルで他に何も送信されないことをゴルーチン(またはメインプログラム)に通知します。


8
AFAIKは、ガベージコレクションされた言語でも、ファイル、ソケットなどのアンマネージリソースを解放する責任はプログラマーにあります。ファイルのようにチャネルを閉じる必要がありますか?
Kluyg、2011

3
@Kluyg答えはノーです。あなたはOSのリソースについて話しています(どのチャネルはそうではありません)。これはリソースと言語に依存しますが、通常は、GCが実行しないためではなく、非決定的であるため、OSリソースを手動で閉じることをお勧めします。最も一般的な関連の落とし穴は、あまりにも多くの開いているファイルのエラーです。ファイルを開いたままにします... GCがそうすることを期待します...メモリが不足することはありません(したがって、GCは起動しません)... OSレベルでファイル記述子が不足します。OSはプロセスを終了します:)
Pijusn 2017

なぜこれがずっと正解で他の受け入れられた回答と同じであるのに、なぜこれが非常に多くの反対票を獲得したのか混乱しています...
eja
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.