орден горутинов работает - PullRequest
       2

орден горутинов работает

0 голосов
/ 16 сентября 2018

Я изучаю Голанг прямо сейчас, и наткнулся на несколько интересных уроков онлайн. например этот: https://golangbot.com/channels/

в этой части о goroutines, есть один пример, как показано ниже:

package main

import (
    "fmt"
)

func producer(chnl chan int) {
    for i := 0; i < 10; i++ {
        fmt.Println("debugging send...", i)
        chnl <- i
    }
    close(chnl)
}
func main() {
    ch := make(chan int)
    go producer(ch)
    for {
        v, ok := <-ch
        if ok == false {
            break
        }
        fmt.Println("Received ", v, ok)
    }
}

строка fmt.Println("debugging send...", i) добавлена ​​мной для целей отладки. и вывод:

debugging send... 0
debugging send... 1
Received  0 true
Received  1 true
debugging send... 2
debugging send... 3
Received  2 true
Received  3 true
debugging send... 4
debugging send... 5
Received  4 true
Received  5 true
debugging send... 6
debugging send... 7
Received  6 true
Received  7 true
debugging send... 8
debugging send... 9
Received  8 true
Received  9 true

Порядок вывода мне интересен, но я не могу полностью понять, что происходит под капотом.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

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

Если вы заинтересованы в прочтении, ознакомьтесь с этими ссылками

  1. http://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part1.html
  2. https://rakyll.org/scheduler/
  3. https://docs.google.com/document/d/1yIAYmbvL3JxOKOjuCyon7JhW4cSv1wy5hC0ApeGMV9s/pub
0 голосов
/ 16 сентября 2018

Единственные места, где есть синхронизация - это операции с каналами.Не должно быть корреляции между порядком операций в подпрограммах вне этих операторов.

Запуск вашей программы несколько раз, я получал вывод, который у вас есть большую часть времени, но иногда я также видел что-то подобное:

debugging send... 0
debugging send... 1
Received  0 true
Received  1 true
debugging send... 2
debugging send... 3
Received  2 true
Received  3 true
debugging send... 4
debugging send... 5
Received  4 true
Received  5 true
debugging send... 6
debugging send... 7
Received  6 true
debugging send... 8
Received  7 true
Received  8 true
debugging send... 9
Received  9 true

Попробуйте запустить этот сценарий оболочки Bash, чтобы запустить программу несколько раз и сравнить ее вывод:

#!/bin/bash

# c.go has your Go program
go run c.go > first.txt
cat first.txt

echo "======"
while :; do
    go run c.go > run.txt
    if ! diff -q run.txt first.txt; then
        break
    fi
done

cat run.txt

Редактировать: Вам может быть интересно прочитать https://golang.org/ref/mem осинхронизация в Go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...