Go за Прикладом: Синхронізація каналу

Work in Progress / Сайт в процесі розробки

Ми можемо використовувати канали для синхронізації між горутинами. Ось - приклад використання блокуючого отримання, задля очікування завершення горутини.

package main
import "fmt"
import "time"

Ця функція буде запущена в горутині. Канал done буде використано щоб надіслати повідомлення іншій про завершення роботи цієї функції.

func worker(done chan bool) {
    fmt.Print("працюємо...")
    time.Sleep(time.Second)
    fmt.Println("готово")

Надіслати значення, щоб повідомити що завершення роботи.

    done <- true
}
func main() {

Запустити горутину worker, і виділити їй канал по якому вона передасть повідомлення.

    done := make(chan bool, 1)
    go worker(done)

Блокуємо, допоки ми не отримаємо повідомлення з каналу, який ми передали функції запущені в горутині.

    <-done
}

Якщо ви приберете лінію <- done з программи, то вона завершиться ще до того як worker буде запущено.

$ go run channel-synchronization.go
працюємо...готово

Наступний приклад: Напрямки каналу.