вторник, 15 января 2019 г.

Основы Go: Go-процедуры (goroutines)

Go-процедура это легкий поток, управляемый средой выполнения Go.

go f(x, y, z)

создает новую go-процедуру и запускает в ней

f(x, y, z)

f, x, y, и z определяются в текущей go-процедуре, а выполнение f происходит в новой go-процедуре.

Go-процедуры исполняются в том же адресном пространстве, поэтому доступ к общей памяти должен быть синхронизирован. Пакет sync предоставляет полезные примитивы, хотя они вам не понадобятся часто в Go, т.к. существуют другие.

package main

import (
  "fmt"
  "time"
)

func say(s string) {
  for i := 0; i < 5; i++ {
    time.Sleep(100 * time.Millisecond)
    fmt.Println(s)
  }
}

func main() {
  go say("world")
  say("hello")
}

Вывод:

world
hello
hello
world
world
hello
hello
world
world
hello

Еще один простой пример:

package main

import (
    "fmt"
    "time"
)

func main() {
    go say("ho!", 2*time.Second)  
    go say("hey!", 1*time.Second)

    // Делаем чтобы main уснул на 4 секунды
    // чтобы go-процедуры могли завершиться
    time.Sleep(4 * time.Second)
}

// say печатает текст после засыпания на Х секунд
func say(text string, secs time.Duration) {
    time.Sleep(secs)
    fmt.Println(text)
}

Вывод:

hey!
ho!


Читайте также:


Комментариев нет:

Отправить комментарий