goroutine 用法

记录goroutine相关用法
复制代码

在golang中使用goroutine很简单,经过go 关键字便可使用,例如:golang

func C(a chan struct{}){
	<- a
	fmt.Println("C()!")
}
复制代码

其实多个goroutine执行是无序的,要想他们以必定的顺序执行,能够经过channel(使用 chan关键词)来规划他们。bash

完整案例1

package main

import (
	"fmt"
	"time"
)

func main(){
	testrun := true
	f := func() {
		for testrun{
			fmt.Println("sub proc running ...")
			time.Sleep(1 * time.Second)
		}
		fmt.Println("sub proc exit")
	}
	go f()
	go f()
	go f()
	time.Sleep(2 * time.Second)
	testrun = false
	time.Sleep(3 * time.Second)
	fmt.Println("main proc exit")
	go fmt.Println(1)
	go fmt.Println(2)
	go fmt.Println(3)
	fmt.Println("main goroutine finished!")
	time.Sleep(1 *time.Second)
}

复制代码

运行结果:ui

sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc exit
sub proc exit
sub proc exit
main proc exit
main goroutine finished!
2
1
3

Process finished with exit code 0
复制代码

完整案例2

package main

import (
	"fmt"
	"time"
)

// A先被a阻塞,A()结束后关闭b,使b可读
func A(a,b chan struct{}){
	<- a
	fmt.Println("A()!")
	time.Sleep(1 * time.Second)
	close(b)
}

//B首先被a阻塞,B()结束后关闭b,使b可读
func B(a,b chan struct{}){
	<-a
	fmt.Println("B()!")
	close(b)
}

//C首先被a阻塞
func C(a chan struct{}){
	<- a
	fmt.Println("C()!")
}

func main(){
	x := make(chan struct{})
	y := make(chan struct{})
	z := make(chan struct{})

	fmt.Println("C:z")
	go C(z)
	fmt.Println("A:x,y")
	go A(x,y)
	fmt.Println("C:z")
	go C(z)
	fmt.Println("B: y,z")
	go B(y,z)
	fmt.Println("C:z")
	go C(z)
	close(x)
	time.Sleep(3 * time.Second)
}
复制代码

运行结果:spa

C:z
A:x,y
C:z
B: y,z
C:z
A()!
B()!
C()!
C()!
C()!

Process finished with exit code 0

复制代码

经过两个案例,能够看出没有使用chan,运行是无序的,当使用了chan,运行就变得可控了。code

相关文章
相关标签/搜索