fmt.Print в процедуре go * может * не выводиться, когда главный поток находится в цикле - PullRequest
0 голосов
/ 15 февраля 2019

Следующий код как в https://play.golang.org/p/X1-jZ2JcbOQ

package main
import (
        "fmt"
)
func p(s string) {
        fmt.Println(s)
}

func main() {
    go fmt.Println("1")
    go p("2")
    for {}   // infinite loop
}

печатает 1 2 определенно в Windows с golang 1.11, но ничего не печатает определенно в Linux с golang 1.11.4.Я могу понять первое поведение, но не второе.Почему программа go не выполняет не главный поток все время?

Есть ли причина этого?

1 Ответ

0 голосов
/ 15 февраля 2019

Go Playground работает с GOMAXPROCS = 1.Попробуйте это на игровой площадке:

package main

import (
  "fmt"
  "runtime"
)

func main() {
  fmt.Println(runtime.GOMAXPROCS(0))
}

Когда вы работаете локально, возможно, у вас будет более высокое значение GOMAXPROCS.

Даже на детской площадке вы можете увидеть работу печати, если отменитеОсновная процедура, как показано ниже, введя Sleep [https://play.golang.org/p/QquMPZSd6kI]:

func main() {
    go fmt.Println("1")
    go p("2")

    time.Sleep(time.Second)
    for {}
 }

ИЛИ

Измените GOMAXPROCS при запуске:

    runtime.GOMAXPROCS(2)
...