Go速成无压力【十五】:并发 (Goroutines)

(一)Goroutines

Goroutines是Go运行时的轻量级线程管理,Goroutines运行在同样的地址空间,所以使用的共享内存必须是同步的

开始一个Go的并发的写法如下:

go f(x,y,z)

(二)Channels

Channels是一个可以发送和接受数据的管道,操作符号是 <- , 日常操作如下:

ch <- v //发送v的值给ch
v := <-ch //初始化v且接受来自ch的值

如下所示:

package main

import (
	"fmt"
)

func word1(s string, c chan string) {
	res := "Hello : " + s
	c <- res
}

func word2(s string, c chan string) {
	res := "Hi : " + s
	c <- res
}

func main() {
	s := []string{"Galarxy", "Kok"}
	c := make(chan string)
	go word1(s[0], c)
	go word2(s[1], c)
	x, y := <-c, <-c
	fmt.Println(x, y)
}

运行结果:

Hi : Kok Hello : Galarxy

(三)管道的范围与关闭

一个管道在没有任何值发送的时候需要指明一个 close 关键字用于关闭管道,一个管道接收第二个参数的时候可以判断该参数是否为空,如:

v, ok := <- ch

当ok为false的时候,表示该管道已经没有接收更多的值,且已经关闭

package main

import (
	"fmt"
)

func fibonacci(n int, c chan int) {
	x, y := 0, 1
	for i := 0; i < n; i++ {
		c <- x
		x, y = y, x+y
	}
	close(c)
}

func main() {
	c := make(chan int, 10)
	go fibonacci(cap(c), c)
	for i := range c {
		fmt.Println(i)
	}
}

运行结果:

0
1
1
2
3
5
8
13
21
34

提示:应该只选择管道发送者关闭通道,而不是接收者,发送一个已经关闭了的管道将会导致报错



(四)Select

select 语句使用与go并发过程的多操作中

package main

import "fmt"

func fibonacci(c, quit chan int) {
	x, y := 0, 1
	for {
		select {
		case c <- x:
			x, y = y, x+y
		case <-quit:
			close(c)
			fmt.Println("quit")
			return
		}
	}
}

func main() {
	c := make(chan int)
	quit := make(chan int)
	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println(<-c)
		}
		quit <- 0
	}()

	fibonacci(c, quit)
}

运行结果:

0
1
1
2
3
5
8
13
21
34
quit

(五)Default Selection

当select语句中没有其他事件被选择时,default case 是默认选中的

package main

import (
	"fmt"
	"time"
)

func main() {
	tick := time.Tick(100 * time.Millisecond)
	boom := time.After(500 * time.Millisecond)
	for {
		select {
		case <-tick:
			fmt.Println("tick.")
		case <-boom:
			fmt.Println("BOOM!")
			return
		default:
			fmt.Println("...")
			time.Sleep(50 * time.Millisecond)
		}
	}
}

运行结果:

...
...
tick.
...
...
tick.
...
...
tick.
...
...
tick.
...
...
BOOM!

Golang的速成教程就先写到这里吧,是我高估了我自由可用时间的长度,目前已经大三了,才发现我所剩的自由不多了,我还有几个引擎没有开发完,之后都会很少写些什么东西了,以前我写博客是为了记住知识,但是我发现我最近总是在遗忘什么东西,有时候得到的学习资料更多的是英文的,翻译为中文会有语义上的冲突,思维也会微微的混乱,真的很佩服那些能写很多文章的人,那些作者花费了很多时间和精力去铸就一些具有价值性的见解,我的大脑总是在遗忘拥有和获得新知之间浑浑噩噩地思考着,旧有的依靠记录信息来给自己大脑制造印象的学习方式已经不适合目前的我,如果有时间,之后还是会回来写写记记些什么的,把更多的时间投入到别人没做,自己想做的事才是对我来说真正有意义的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值