синхронизация канала

This commit is contained in:
badkaktus 2019-10-07 22:08:57 +03:00
parent 85d5b5771d
commit 8cd1fe18bd
3 changed files with 17 additions and 17 deletions

View File

@ -22,7 +22,7 @@ Switch
Горутины (Goroutines) Горутины (Goroutines)
Каналы (Channels) Каналы (Channels)
Буферизированный канал (Channel Buffering) Буферизированный канал (Channel Buffering)
Channel Synchronization Синхронизация канала (Channel Synchronization)
Channel Directions Channel Directions
Select Select
Timeouts Timeouts

View File

@ -1,8 +1,8 @@
// We can use channels to synchronize execution // Мы можем использовать каналы для синхронизации
// across goroutines. Here's an example of using a // выполнения между горутинами. Вот пример
// blocking receive to wait for a goroutine to finish. // использования блокирующего получения для ожидания
// When waiting for multiple goroutines to finish, // завершения работы горутины. При ожидании завершения
// you may prefer to use a [WaitGroup](waitgroups). // нескольких процедур вы можете использовать [WaitGroup](waitgroups).
package main package main
@ -11,26 +11,27 @@ import (
"time" "time"
) )
// This is the function we'll run in a goroutine. The // Эту функцию мы будем запускать в горутине. Канал
// `done` channel will be used to notify another // `done` будет использован для оповещения другой
// goroutine that this function's work is done. // горутины о том, что функция выполнена успешно.
func worker(done chan bool) { func worker(done chan bool) {
fmt.Print("working...") fmt.Print("working...")
time.Sleep(time.Second) time.Sleep(time.Second)
fmt.Println("done") fmt.Println("done")
// Send a value to notify that we're done. // Отправить значение, чтобы сказать что функция
// выполнена успешно.
done <- true done <- true
} }
func main() { func main() {
// Start a worker goroutine, giving it the channel to // Запустите воркера в горутине и передайте ему канал
// notify on. // для оповещения.
done := make(chan bool, 1) done := make(chan bool, 1)
go worker(done) go worker(done)
// Block until we receive a notification from the // Блокируйте, пока мы не получим уведомление от
// worker on the channel. // воркера из канала.
<-done <-done
} }

View File

@ -1,6 +1,5 @@
$ go run channel-synchronization.go $ go run channel-synchronization.go
working...done working...done
# If you removed the `<- done` line from this program, the # Если вы удалите строку `<- done` из этой программы,
# program would exit before the `worker` even # программа закроется до того, как `воркер` даже запустится.
# started.