Lập trình đồng thời trong Go
Goroutines and sync.WaitGroup
Start lightweight threads with the go keyword and wait for all of them to finish.
Bạn sẽ học được gì
- The go keyword
- WaitGroup: Add, Done, Wait
- Writing results safely
Five goroutines
- 1
wg.Add(1)count one more - 2
go square(...)runs on its own - 3
wg.Done()finished - 4
wg.Wait()main continues
Work that runs at the same time
A goroutine is a function that runs at the same time as the rest of the program. Writing go before a call starts one. Goroutines are cheap, so a program can run thousands of them.
main does not wait for goroutines by itself, so a WaitGroup counts them: Add before starting, Done when one finishes and Wait to block until the count is zero. Each goroutine writes to its own position of results, so the output is always the same.
Những điểm quan trọng
- go
f()starts f in a new goroutine. - main does not wait by itself.
wg.Waitblocks until every Done is called.
Ví dụ Go chạy được
main.go
package main
import (
"fmt"
"sync"
)
func square(id int, results []int, wg *sync.WaitGroup) {
defer wg.Done()
results[id] = id * id
}
func main() {
var wg sync.WaitGroup
results := make([]int, 5)
for id := 0; id < 5; id++ {
wg.Add(1)
go square(id, results, &wg)
}
wg.Wait() // block until every goroutine calls Done
fmt.Println(results)
}
[0 1 4 9 16]Luyện tập
Mở ví dụ trong trình biên dịch online, đổi một giá trị hoặc thêm một dòng, rồi đoán kết quả trước khi chạy. Sau đó cố ý làm code bị lỗi và đọc thông báo của trình biên dịch.
Bạn học xong bài này chưa?
Đánh dấu đã học để theo dõi tiến độ của bạn.
Tiến độ của bạn đang được lưu trong trình duyệt này Đăng nhập để giữ tiến độ trên mọi thiết bị.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
Tất cả thử thách