|
Cơ chế mặc định để quản lý state trong Go là giao tiếp
qua channels. Chúng ta đã thấy điều này ở ví dụ với
worker pools. Ngoài ra còn có một vài
lựa chọn khác để quản lý state. Ở đây chúng ta sẽ
xem xét việc sử dụng package |
|
![]()
package main |
|
import ( "fmt" "sync" "sync/atomic" ) |
|
func main() { |
|
|
Ta sẽ dùng một số nguyên không dấu để biểu diễn biến đếm (luôn dương). |
var ops uint64
|
|
Một WaitGroup sẽ giúp chúng ta đợi cho tất cả các goroutine hoàn thành việc thực thi. |
var wg sync.WaitGroup
|
|
Ta sẽ khởi tạo 50 goroutine mà mỗi goroutine sẽ tăng biến đếm lên 1000 lần. |
for i := 0; i < 50; i++ {
wg.Add(1)
|
|
Để tự động tăng biến đếm, ta sử dụng
|
go func() { for c := 0; c < 1000; c++ { |
atomic.AddUint64(&ops, 1) } wg.Done() }() } |
|
|
Chờ cho tất cả các goroutine hoàn thành. |
wg.Wait()
|
|
Bây giờ ta có thể an toàn truy cập vào |
fmt.Println("ops:", ops)
}
|
|
Ta mong đợi sẽ nhận được chính xác 50,000 phép tính.
Nếu chúng ta sử dụng phép tính không đảm bảo
tính toàn vẹn dữ liệu như |
$ go run atomic-counters.go ops: 50000 |
|
Tiếp theo, chúng ta sẽ xem xét mutex, một công cụ khác để quản lý state. |
Ví dụ tiếp theo: Mutexes.