golang goroutine、channel和select

发布时间:2020-08-15 23:35:00 作者:欺世
来源:网络 阅读:705

goroutine

package main

import "fmt"
import "time"

func printn(id int){
	for i := 0;i<10;i++ {
		fmt.Println(id,":",i)
	}
}


func main(){
	for i :=0;i<5;i++ {
		go printn(i)
	}
	fmt.Println("waiting...")
	time.Sleep(time.Second * 3)
}
//执行结果:
waiting...
0 : 0
2 : 0
0 : 1
2 : 1
0 : 2
1 : 0
2 : 2
0 : 3
2 : 3
1 : 1
0 : 4
2 : 4
0 : 5
1 : 2
2 : 5
0 : 6
1 : 3
2 : 6
0 : 7
1 : 4
2 : 7
1 : 5
3 : 0
3 : 1
3 : 2
2 : 8
1 : 6
2 : 9
1 : 7
3 : 3
0 : 8
0 : 9
1 : 8
3 : 4
3 : 5
3 : 6
3 : 7
3 : 8
3 : 9
1 : 9
4 : 0
4 : 1
4 : 2
4 : 3
4 : 4
4 : 5
4 : 6
4 : 7
4 : 8
4 : 9


// 如果把sleep去掉会怎么样?
package main

import "fmt"
//import "time"

func printn(id int){
	for i := 0;i<10;i++ {
		fmt.Println(id,":",i)
	}
}


func main(){
	for i :=0;i<5;i++ {
		go printn(i)
	}
	fmt.Println("waiting...")
	//time.Sleep(time.Second * 3)
}
// 执行结果:
waiting...            //原因是没有sleep,当main函数执行完会中断其他所有没执行完的任务

2、channel

package main

import "fmt"
//import "time"

func printn(id int,c chan int){
	for i := 0;i<10;i++ {
		fmt.Println(id,":",i)
	}
	c <- 0      //将数值存到 c
}


func main(){
	c :=make(chan int)   // 创建一个channel 
	go printn(1,c)
//	for i :=0;i<5;i++ {
//		go printn(i)
//	}
	fmt.Println("waiting...")
	//time.Sleep(time.Second * 3)
	<- c        // 取出c得值
}
// 执行结果:
waiting...
1 : 0
1 : 1
1 : 2
1 : 3
1 : 4
1 : 5
1 : 6
1 : 7
1 : 8
1 : 9

3、select 

package main

import "fmt"
import "time"

func fun1(c chan string){
	for {
		c <- "from fun1 +"
		time.Sleep(time.Second * 2)
	}
}

func fun2(c chan string){
        for {
                c <- "from fun2 -"
                time.Sleep(time.Second * 2)
        }
}




func main(){
	c1 :=make(chan string)
	c2 :=make(chan string)
	go fun1(c1)
	go fun2(c2)
	for {
	select {           
		case msg1 := <- c1:
			fmt.Println(msg1)
		case msg2 := <- c2:
                        fmt.Println(msg2)

	}
	}

}
// 执行结果:

from fun2 -
from fun1 +
from fun2 -
from fun1 +
from fun1 +
from fun2 -
from fun2 -
from fun1 +
from fun1 +
from fun2 -
...........


推荐阅读:
  1. golang 碎片整理之 并发
  2. 使用golang的channel的坑

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

channel golang goroutine

上一篇:存放在共享服务器中的Excel 超链接路径自动改变

下一篇:.net 访问 geoserver 发布的 wms   跨域问题解决方案

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》