2011-12-21 12 views
78

Goのチャンネルを開いたままにしておくことはできますか?メモリリークにつながるでしょうか?次のコードはOKですか?チャンネルを開いたままにしてもよろしいですか?

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

答えて

106

Goチャンネルを永遠に開いたままにしておいても問題ありません。チャンネルが使用されなくなると、ガベージコレクションされます。

受信者が の場合、チャネルを閉じる必要があることに注意してください。チャネルを閉じることは、 チャネル上の制御信号であり、これ以上データがないことを示す。

Design Question: Channel Closing

+0

私はリンクの応答に同意できません。私は2GBの範囲でメモリリークがありました。閉鎖を追加すると同時に、間欠泉が細流になりました。 – Richard

+0

@リチャード:スレッド全体を注意深く読んでください。 'gcgo'の作者と' gccgo'の作者は、 'close'を探していない限り、' close'sチャンネルは必要ではないと言っています。それは権威あるアドバイスです。 – peterSO

+1

@peterSOさん、それは私が見たことを知っているかもしれませんが、それは私が報告したものですので、私を却下しないでください。 – Richard

-1

ゴーはガベージコレクションされているため、実際には「無料」する必要はありません。

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

+6

を私の知る限りでも、ごみ収集の言語でプログラマは未管理のリソースを解放する責任があります。クローズファイル、ソケットなど。ファイルのようにチャンネルを閉じる必要がありますか? – Kluyg

+0

@Kluyg答えはいいえ。あなたは、OSのリソース(チャネルではない)について話しています。これはリソースと言語に依存しますが、通常はGCがそうしないからではなく、非決定的であるため、OSリソースを手動で閉じることをお勧めします。最も一般的な_ _ _ _ _ _ _ _ _ _多くのオープンファイル_ _ _エラーが発生しています。あなたはファイルを開いたままにします...あなたはGCがそうすることを期待しています...あなたはメモリを使い果たしていません(したがって、GCは起動しません)... OSレベルでファイルディスクリプタを使い果たしました。 OSはプロセスを終了させます:) – Pijusn

1

はい、それはオープンチャネルを残してOKだし、実際にそれが典型的です。開いているチャンネルはチャンネルオブジェクトへの参照を構成しないので、ガベージコレクションされないようにします。

11

はい、チャンネルを開いたままにしても問題ありません。 the go programming language本の記載内容:

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

関連する問題