|
Một goroutine một luông thực thi lightweight (nhẹ). |
|
![]()
package main |
|
import ( "fmt" "time" ) |
|
func f(from string) { for i := 0; i < 3; i++ { fmt.Println(from, ":", i) } } |
|
func main() { |
|
|
Giả sử chúng ta gọi một hàm |
f("direct")
|
|
Để gọi hàm này trong một goroutine, sử dụng cú pháp
|
go f("goroutine")
|
|
Bạn cũng có thể bắt đầu một goroutine cho một lần gọi hàm ẩn danh. |
go func(msg string) {
fmt.Println(msg)
}("going")
|
|
Hai lần gọi hàm của chúng ta đang được thực thi bất đồng bộ trong các goroutine riêng biệt. Đợi chúng thực thi xong (để có một cách tiếp cận đáng tin cậy hơn, ta có thể sử dụng một WaitGroup). |
time.Sleep(time.Second)
fmt.Println("done")
}
|
|
Khi chúng ta chạy chương trình này, chúng ta sẽ thấy đầu tiên là kết quả của lần gọi đồng bộ, sau đó là kết quả của hai goroutines. Kết quả của các goroutines’ có thể được xen kẽ lẫn nhau vì các goroutine đang được thực thi song song bởi Go runtime. |
$ go run goroutines.go direct : 0 direct : 1 direct : 2 goroutine : 0 going goroutine : 1 goroutine : 2 done |
|
Tiếp theo, chúng ta sẽ xem xét một phần bổ sung cho goroutine trong các concurrent Go program |
#(chương trình Go đồng thời): channels (kênh).
|
Ví dụ tiếp theo: Channels.