Trong trường hợp của tôi, tôi có hàng ngàn goroutines làm việc đồng thời như work()
. Tôi cũng có một goroutine sync()
. Khi bắt đầu sync
, tôi cần bất kỳ goroutine nào khác để tạm dừng một lúc sau khi hoàn thành công việc đồng bộ hóa. Đây là mã của tôi:Có cách nào thanh lịch để tạm dừng và tiếp tục bất kỳ goroutine nào khác trong golang không?
var channels []chan int
var channels_mutex sync.Mutex
func work() {
channel := make(chan int, 1)
channels_mutex.Lock()
channels = append(channels, channel)
channels_mutex.Unlock()
for {
for {
sync_stat := <- channel // blocked here
if sync_stat == 0 { // if sync complete
break
}
}
// Do some jobs
if (some condition) {
return
}
}
}
func sync() {
channels_mutex.Lock()
// do some sync
for int i := 0; i != len(channels); i++ {
channels[i] <- 0
}
channels_mutex.Unlock()
}
Bây giờ vấn đề là, kể từ <-
luôn chặn trên đọc, mỗi lần đi vào sync_stat := <- channel
chặn. Tôi biết nếu kênh đã bị đóng, kênh sẽ không bị chặn nhưng vì tôi phải sử dụng kênh này cho đến khi thoát work()
và tôi không tìm thấy bất kỳ cách nào để mở lại kênh đã đóng.
Tôi nghi ngờ bản thân mình sai hướng, vì vậy mọi trợ giúp đều được đánh giá cao. Có cách nào "thanh lịch" để tạm dừng & tiếp tục bất kỳ goroutine nào khác trong golang không?
'<-time.After (1e1)' có nghĩa là gì? –
Nó tạm dừng goroutine trong 1 giây (1e9 nano giây). Nó được sử dụng trong ví dụ này để làm cho nó trông giống như bộ điều khiển đang làm một số công việc thực tế. 'time.After()' trả về một kênh, gửi một tín hiệu sau thời gian chờ đã cho. '<-time.After (N)', chỉ đơn giản là chặn trên kênh đó cho đến khi nhận được tín hiệu đó. – jimt
Và điều này làm cho tôi nhận ra một suy nghĩ khác: tại sao chúng ta không chỉ sử dụng một giá trị toàn cầu đại diện cho trạng thái điều khiển, và 'công nhân' kiểm tra giá trị toàn cầu mỗi lần? Tôi biết nó không phải là một thực hành tốt, nhưng tôi muốn biết lý do. –