Именно из-за этой линии:
runtime.GOMAXPROCS(1)
Как goroutine это способ выполнения кода одновременно, все goroutine вы создаете в цикле придется ждать прока.
Поскольку у вас есть только один, и он занят выполнением цикла, у вас будет стек goroutine.
Когда петли заканчиваются, у proc есть время, чтобы выполнить первый горутин, который был последним создан, а затем сделать то же самое с стеком один за другим, но на этот раз в последовательности.
Попробуйте поместить Просы и посмотрите, что будет.
Имейте в виду, что при одновременном выполнении заказа, в котором выполняется код, не гарантируется, как уже упоминалось в комментарии.
Здесь у вас есть последовательность, только потому, что у вас есть только один процесс.
Если ваша цель состоит в том, чтобы элементы обрабатывались последовательно даже в параллельном режиме, вы должны использовать каналы.
Позвольте мне показать образец кода, сделать работу:
пакет главный
import (
"fmt"
"runtime"
)
func printNumbers(text string, ns chan int) {
for n := range ns {
fmt.Println(text, n)
}
}
func main() {
runtime.GOMAXPROCS(1) // cpu core를 하나만 사용하도록 해 놓음
s := "test string"
numbers := make(chan int)
go printNumbers(s, numbers)
go func() {
for i := 0; i < 100; i++ {
numbers <- i
}
close(numbers)
}()
fmt.Scanln()
}
Как вы можете видеть, это просто новая версия вашего, но если вы выполняете, вы должны получить надлежащее последовательность.
Основные изменения состоят в том, что теперь у вас есть 2 goroutine, один для печати и один для цикла.
2 goroutine talk throungh канал int.
Когда программа запускает первый вызов goroutin, функция printNumbers, что stai ждет, пока что-то не будет записано в канал.
Затем запустите второй поворот, который записывает по одному целые числа в канал.
После того, как закончен, как только у вас есть только 1 процесс, функция printNumbers запускается снова, так как есть предметы внутри канала.
Это петли, пока не закончится itmes.
Конечно, у вас здесь 2 петли, но вы не можете этого избежать.
Итак, теперь попробуйте ослабить процесс, как вы пожелаете, и посмотрите, что произойдет.
Похоже, что код выводит строки можно было ожидать: https://play.golang.org/p/54IP16NQZu При работе с потоками и goroutines порядок выполнения не гарантируется, поэтому они могут распечатываться в любом порядке, и это было бы действительно. – Omar
в результате для моего кода проблема была в первых данных - это последние данные, которые не должны быть вызваны. другие печатные данные являются нормальными, за исключением первых данных. поэтому у меня есть вопрос. но я понял после чтения в 2 ответа. Спасибо за ваш комментарий. –