@dyxizm

Как решить проблему с примером для golang goroutines?

Есть пример для языка Gо, с использованием его легковесных потоков goroutines. Помогите разобраться, почему этот пример выполняется неверно.

Код примера:
// A _goroutine_ is a lightweight thread of execution.

package main

import "fmt"

func f(from string) {
    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
    }
}

func main() {

    // Suppose we have a function call `f(s)`. Here's how
    // we'd call that in the usual way, running it
    // synchronously.
    f("direct")

    // To invoke this function in a goroutine, use
    // `go f(s)`. This new goroutine will execute
    // concurrently with the calling one.
    go f("goroutine")

    // You can also start a goroutine for an anonymous
    // function call.
    go func(msg string) {
        fmt.Println(msg)
    }("going")

    // Our two goroutines are running asynchronously in
    // separate goroutines now, so execution falls through
    // to here. This `Scanln` code requires we press a key
    // before the program exits.
    var input string
    fmt.Scanln(&input)
    fmt.Println("done")
}


На странице где я нашел этот пример - https://gobyexample.com/goroutines, написан вот такой вывод:


$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2

done


Но если выполнить пример тут - play.golang.org/p/aIO_Wi3hJj

вывод получается такой:

direct : 0
direct : 1
direct : 2
done


p.s. Как раз сейчас пытаюсь написать скрипт, где нужно выполнять функцию в нескольких потоках, но в результате выполнение этой функции игнорируется, примерно как получается тут.
  • Вопрос задан
  • 4569 просмотров
Решения вопроса 1
miolini
@miolini
Попробуйте, с таким механизмом синхронизации.

package main

import "fmt"
import "sync"

func main() {
	waitGroup := sync.WaitGroup{}
	waitGroup.Add(1)
	go func() {
		fmt.Println("Hello, playground")
		waitGroup.Done()
	}()
	waitGroup.Wait()
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
q1t
@q1t
play.golang.org/p/J0tgsi0U_E
проблема была в вводе( может в песочнице не поддерживается ) а может и не в этом, но этот пример рабочий, на локальной машине выполнится корректно.

в первом варианте для верности можно синхронизировать гоуртины, и тогда результат будет предсказуем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы