【关于goroutine的使用】

1.计算代码的运行时间

start := time.Now()
cost := time.Since(start)
fmt.Printf("花费的时间",cost)

2.goroutine的基础测试

func main()  {
	start:=time.Now().Unix()

	var  wg sync.WaitGroup

	wg.Add(2)
	go func() {
		account(5,"绵羊")
		wg.Done()
	}()

	go func() {
		account(5,"山羊")
		wg.Done()
	}()
	wg.Wait()
	fmt.Println(counter)
	end:=time.Now().Unix()-start
	fmt.Println(end)


}
var counter int
func account(n int ,animal string){

	for i:=0;i<n;i++ {
		fmt.Println(i+1,animal)
		counter = counter+1
	}
}

3.采用了管道的goroutine

func main() {

	c1:=make(chan string)
	c2:=make(chan string)
	go func() {
		for  {
			c1 <- "山羊"
			time.Sleep(time.Microsecond *500)
		}

	}()
	go func() {
		for  {
			c2 <- "绵羊"
			time.Sleep(time.Microsecond *2000)
		}
	}()

	for  {
		select {
		case msg := <-c1:
			fmt.Println(msg)
			case msg:=<-c2:
				fmt.Println(msg)
		}

	}
}

4.搜索文件中有test的文件或者文件夹


var query="test"
var matches int


func main(){

	start := time.Now()
	//GetFiles(".")
	search("D:/")
	fmt.Println(matches,"matches")
	fmt.Println(time.Since(start))

}

func search(path string)  {
	files,err:=ioutil.ReadDir(path)
	if err ==nil {
		for _, f := range files {
			name := f.Name()
			if name ==query {
				matches++
			}
			if f.IsDir() {
				//如果是一个目录
				search(path+name+"/")
			}

		}

	}
}
//最后的我本地搜寻到的结果数据为
183 matches
33.4619965s

5.采用goroutine来编写搜索文件数量

//如果遇到fatal error: all goroutines are asleep - deadlock!的问题
//可根据实际情况将maxWorkCount改小一点
var query="test"
var matches int
var workCount =0
var maxWorkCount =8
var searchRequest=make(chan string)
var workDone = make(chan bool)
var foundMatch = make(chan bool)

func main(){

	start := time.Now()
	workCount=1

	//GetFiles(".")
	 go search("D:/",true)
	waitForWorkers()
	fmt.Println(matches,"matches")
	fmt.Println(time.Since(start))

}

func waitForWorkers() {
	for {
		select {
		case path:= <-searchRequest:
			workCount++
			go search(path,true)
		case <-workDone:
			workCount--
			if workCount == 0 {
				return
			}
		case<-foundMatch:
				matches++
		}
	}

}

func search(path string,master bool)  {
	files,err:=ioutil.ReadDir(path)
	if err ==nil {
		for _, f := range files {
			name := f.Name()
			if name ==query {
				foundMatch<-true
			}
			if f.IsDir() {
				//如果是一个目录
				if workCount<maxWorkCount {
					searchRequest<-path+name+"/"
				}else {
					search(path+name+"/",false)

				}
			}
		}
		if master{
			workDone<-true
		}
	}
}

后序会继续添加其他工具

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值