Goroutines là một trong những đặc điểm nổi bật của ngôn ngữ lập trình Go, cho phép bạn thực thi các hàm hoặc phương thức một cách đồng thời (concurrent) một cách rất hiệu quả và dễ dàng. Chúng cung cấp một cách đơn giản để xây dựng các chương trình bất đồng bộ mà không cần quản lý các luồng (threads) một cách phức tạp.
Goroutines nhẹ hơn nhiều so với các luồng hệ thống (OS threads). Khi bạn tạo một goroutine mới, Go runtime chỉ cần một vài kilobyte bộ nhớ để bắt đầu, và số lượng goroutines mà bạn có thể tạo ra có thể lên đến hàng triệu mà không gặp vấn đề về hiệu suất.
Go runtime tự động quản lý goroutines và phân bổ chúng tới các luồng hệ thống một cách hiệu quả. Bạn không cần phải lo lắng về việc tạo, hủy, hay quản lý vòng đời của chúng.
Goroutines có thể giao tiếp với nhau thông qua channels, cho phép bạn truyền dữ liệu giữa các goroutines một cách an toàn và hiệu quả. Channels giúp tránh các vấn đề đồng bộ hóa phức tạp thường gặp khi sử dụng các biến toàn cục hoặc mutex.
Để khởi tạo một goroutine, bạn chỉ cần sử dụng từ khóa go
trước một hàm. Dưới đây là một ví dụ đơn giản về cách sử dụng goroutines trong Go.
package main import ( "fmt" "time" ) func sayHello() { for i := 0; i < 5; i++ { time.Sleep(1 * time.Second) fmt.Println("Hello from Goroutine!") } } func main() { // Khởi tạo một goroutine go sayHello() for i := 0; i < 5; i++ { time.Sleep(1 * time.Second) fmt.Println("Hello from Main!") } // Đợi một chút trước khi chương trình kết thúc time.Sleep(6 * time.Second) }
main
, chúng ta khởi tạo một goroutine bằng cách gọi go sayHello()
. Điều này có nghĩa là hàm sayHello
sẽ chạy đồng thời với phần còn lại của hàm main
.sayHello
và main
sẽ chạy song song, do đó, bạn sẽ thấy thông điệp từ cả hai hàm được in ra đồng thời.time.Sleep(6 * time.Second)
trong hàm main
. Điều này cho phép goroutine có đủ thời gian để hoàn thành trước khi chương trình kết thúc.Goroutines là một tính năng mạnh mẽ của Go, cho phép bạn thực hiện các tác vụ đồng thời một cách dễ dàng và hiệu quả. Với khả năng tạo ra hàng triệu goroutines mà không ảnh hưởng đến hiệu suất, cùng với khả năng giao tiếp qua channels, Go cung cấp một nền tảng lý tưởng cho việc xây dựng các ứng dụng đồng thời. Việc hiểu rõ về goroutines sẽ giúp bạn tận dụng tối đa khả năng của ngôn ngữ Go trong việc phát triển các ứng dụng phức tạp và hiệu quả.