2 cách dễ làm memory leak trong golang
TIL
718
golang
38
Go
39
White

huydx viết ngày 04/07/2016

2 cách dễ làm memory leak trong golang

Có 2 case dưới đây mà một newbie rất dễ mắc phải khi code golang, mà sẽ gây ra memory leak. Cả 2 case đều liên quan đến vòng loop, nên bạn nào code những chương trình dạng daemon (long process) thì nên chú ý.

Deferred Code trong vòng Loop

defer là một hàm rất thú vị của golang để giải quyết vấn đề đóng resource. Tuy nhiên hàm này rất dễ bị nhầm với cách dùng như sau:

func somefunc() {
    for {
        // ...
        defer something.Cleanup()
    }
}

Khi sử dụng defer trong vòng loop như trên, thì hàm CleanUp sẽ không bao giờ được execute, vì hàm somefunc là một hàm chạy infinite loop, không bao giờ kết thúc.

Blocked Goroutines trong vòng Loop

Giả sử bạn có một hàm như sau:

for i := range channels {
    go func() {
        channels[i] <- value
    }()
}

Vì channels <- value là blocking, thế nên đã được gói vào một cái routine để chạy bất đồng bộ. Tuy nhiên hãy nghĩ đến case, khi mà consumer của channels vì một lý do nào đó mà không pull dữ liệu ra từ channels nữa. Khi đó thì cái routine này sẽ không bao h kết thúc, và cứ thế routine sẽ được tạo ra đều đặn mỗi vòng loop -> leak routine.

Để giải quyết bài toán này, chúng ta có thể dùng select

for i := range channels {
    select {
    case channels[i] <- value:
    default:
    }
}

huydx 04-07-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

118 bài viết.
1129 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
190 19
Một ngày đẹp trời, bạn quyết định viết một dịch vụ web dự định sẽ làm thay đổi cả thế giới. Dịch vụ của bạn sẽ kết nối tất cả các thiết bị di động ...
huydx viết 9 tháng trước
190 19
White
178 15
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết hơn 2 năm trước
178 15
White
143 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết 4 năm trước
143 15
Bài viết liên quan
White
12 2
Makefile thực hiện một số thao tác thường dùng trong Go Khi làm project Go mình thường tạo một file Makefile dạng này: Lưu ý nhớ thay thành tên m...
Huy Trần viết gần 3 năm trước
12 2
White
47 16
Go là gì? Dùng nó cho việc gì? Chắc hẳn đến thời điểm hiện tại, không ai là chưa nghe đến Go (hay còn gọi là Golang), một ngôn ngữ lập trình được ...
Huy Trần viết gần 4 năm trước
47 16
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
118 bài viết.
1129 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!