go sched

Sat, Jan 16, 2016
package main

import (
	"fmt"
	"io/ioutil"
	"runtime"
	"sync"
	"time"
)

func main() {
	runtime.GOMAXPROCS(1) // 如果是多核就不一定能看到调度的效果了
	wg := new(sync.WaitGroup)
	wg.Add(4)

	go func() {
		defer wg.Done()
		fmt.Println("start func alpha")
		runtime.Gosched()
		fmt.Println("done func alpha")

	}()

	//IO操作可能会导致go routiner 让出线程(strings或bytes的NewReader不会)
	go func() {
		defer wg.Done()
		fmt.Println("start func beta")

		err := ioutil.WriteFile("file.txt", []byte(`
		go sched test\n
		go sched test\n
		go sched test\n
		go sched test\n
		go sched test\n
		`), 0644)
		if err != nil {
			panic(err)
		}
		fmt.Println("done func beta")
	}()

	// wait 操作也会导致让出线程
	go func() {
		defer wg.Done()
		fmt.Println("start func Gamma")
		time.Sleep(time.Second)
		fmt.Println("done func Gamma")
	}()

	go func() {
		defer wg.Done()
		fmt.Println("start func omega")
		runtime.Gosched()
		fmt.Println("done func omega")
	}()

	wg.Wait()
}