package main

import (
	"fmt"
	"os"
	"runtime"
	"sync"
	"time"
)

func main() {
	if len(os.Args) > 1 && os.Args[1] == "busy" {
		busy()
		return
	}
	fmt.Println("version:", runtime.Version(), runtime.GOOS, runtime.GOARCH)
	fmt.Println("startup: NumCPU=", runtime.NumCPU(), "GOMAXPROCS=", runtime.GOMAXPROCS(0))
	previous := runtime.GOMAXPROCS(1)
	fmt.Println("after explicit setting:", runtime.GOMAXPROCS(0))
	var wg sync.WaitGroup
	for range 4 {
		wg.Go(func() { time.Sleep(time.Millisecond) })
	}
	wg.Wait()
	fmt.Println("four goroutines completed with one P")
	runtime.SetDefaultGOMAXPROCS()
	fmt.Println("restored default:", runtime.GOMAXPROCS(0), "previous:", previous)
}

func busy() {
	runtime.GOMAXPROCS(1)
	started := make(chan struct{})
	go func() {
		close(started)
		for {
		}
	}()
	<-started
	time.Sleep(20 * time.Millisecond)
	fmt.Println("main resumed despite the busy goroutine")
}
