· Lập trình · 2 min read · ... views
Hiểu về Concurrency trong Golang: Goroutines & Channels

Golang nổi tiếng với khả năng xử lý Concurrency (đồng thời) cực kỳ mạnh mẽ và đơn giản nhờ vào Goroutines và Channels. Hãy cùng tìm hiểu nhé.
1. Goroutines là gì?
Goroutine là một “lightweight thread” được quản lý bởi Go runtime (không phải OS thread). Chi phí khởi tạo một goroutine rất thấp (chỉ vài KB stack memory), nên bạn có thể chạy hàng ngàn, thậm chí hàng triệu goroutines cùng lúc.
Để chạy một function dưới dạng goroutine, chỉ cần thêm từ khóa go:
func main() {
go sayHello() // Chạy sayHello ở background
fmt.Println("Main function")
}
func sayHello() {
fmt.Println("Hello Goroutine!")
}2. Channels - Giao tiếp giữa các Goroutines
“Do not communicate by sharing memory; instead, share memory by communicating.” - Rob Pike.
Channels là đường ống (pipe) giúp các goroutines gửi và nhận dữ liệu một cách an toàn (thread-safe) mà không cần dùng Lock/Mutex phức tạp.
func main() {
messages := make(chan string)
go func() {
messages <- "ping" // Gửi dữ liệu vào channel
}()
msg := <-messages // Nhận dữ liệu từ channel
fmt.Println(msg)
}3. Buffered Channels
Mặc định channel là unbuffered (chặn cho đến khi có người nhận). Buffered channel có dung lượng hàng đợi, không chặn người gửi trừ khi buffer đầy.
ch := make(chan int, 2)
ch <- 1
ch <- 2
// ch <- 3 // Sẽ bị block vì buffer đầyKết
Concurrency là vũ khí mạnh nhất của Go. Hiểu rõ Goroutines và Channels sẽ giúp bạn viết được những backend services hiệu năng cao và scalable. Hẹn gặp lại ở bài viết chuyên sâu hơn về select và mutex!



