2011-12-21 32 views
78

Bạn có thể để kênh Go mở vĩnh viễn (không bao giờ đóng kênh) nếu tôi không bao giờ kiểm tra trạng thái của nó không? Nó sẽ dẫn đến rò rỉ bộ nhớ? Mã sau có được không?Bạn có muốn mở kênh không?

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

Trả lời

106

Bạn có thể để kênh Go mở vĩnh viễn và không bao giờ đóng kênh. Khi kênh không còn được sử dụng, nó sẽ được thu gom rác.

Lưu ý rằng chỉ cần đóng kênh nếu người nhận là đang tìm cách đóng. Đóng kênh là tín hiệu điều khiển trên kênh cho biết không còn dữ liệu nào sau đó.

Design Question: Channel Closing

+0

Tôi không chắc chắn tôi đồng ý với phản hồi của liên kết. Tôi đã bị rò rỉ bộ nhớ trong phạm vi 2GB. Ngay sau khi tôi thêm vào các mạch nước chảy đã trở thành một trickle. – Richard

+0

@Richard: Đọc kỹ toàn bộ chuỗi. Tác giả của Go 'gc' và tác giả của' gccgo' nói rằng kênh 'close's là không cần thiết, trừ khi bạn đang tìm kiếm' close'. Đó là lời khuyên có thẩm quyền. – peterSO

+1

@peterSO, có thể nhưng tôi biết những gì tôi đã thấy và đó là những gì tôi đã báo cáo vì vậy xin đừng bỏ tôi. – Richard

-1

Go là rác được thu thập, vì vậy bạn không thực sự phải 'rảnh' bất cứ thứ gì.

Có khả năng đóng kênh, nhưng chủ yếu được sử dụng như - đóng (kênh) - cho goroutine (hoặc chương trình chính) không có gì khác sẽ được gửi trên kênh đó.

+6

AFAIK ngay cả trong một ngôn ngữ thu gom rác thải một lập trình viên vẫn chịu trách nhiệm giải phóng tài nguyên không được quản lý, ví dụ đóng tập tin, ổ cắm và một. Tôi có cần đóng kênh như một tệp không? – Kluyg

+0

@Kluyg Câu trả lời là không. Bạn đang nói về tài nguyên hệ điều hành (kênh nào không). Nó phụ thuộc vào tài nguyên và ngôn ngữ nhưng thường được khuyến nghị đóng tài nguyên hệ điều hành theo cách thủ công không phải vì GC sẽ không làm như vậy mà là vì nó không xác định được. Lỗi _gotcha_ liên quan phổ biến nhất là _too nhiều lỗi files_ mở. Bạn tiếp tục mở tệp ... Bạn mong đợi GC làm như vậy ... Bạn không hết bộ nhớ (do đó GC không khởi động) ... Bạn hết tệp mô tả ở cấp hệ điều hành. Hệ điều hành giết chết quá trình :) – Pijusn

1

Có, đó là OK để rời khỏi kênh mở, và trong thực tế nó là điển hình. Kênh đang mở không cấu thành một tham chiếu đến đối tượng kênh và do đó không giữ cho nó khỏi bị thu gom rác.

11

Vâng, bạn có thể mở kênh. Dưới dạng the go programming language sách đã nêu:

Bạn không cần phải đóng mọi kênh khi bạn đã hoàn tất. Chỉ cần là cần thiết để đóng kênh khi điều quan trọng là yêu cầu số nhận goroutines rằng tất cả dữ liệu đã được gửi. Một kênh mà các yếu tố thu gom rác thải không thể truy cập được sẽ có các tài nguyên được xác nhận lại có được đóng hay không. (Đừng nhầm lẫn này với những hoạt động gần cho các tập tin mở. Điều quan trọng là để gọi Đóng phương pháp trên tất cả các tập tin khi bạn đã hoàn tất với nó.)

Các vấn đề liên quan