go开携程访问mysql_go学习 七 并发携程管道

本文介绍了Go语言中并发编程的概念,包括携程的创建与运行、Gosched的影响、Goexit的使用,以及GOMAXPROCS的设置。详细探讨了通道(Channel)的使用,如无缓冲通道、有缓冲通道、关闭通道和单向通道,并展示了生产者消费者模型。此外,还讲解了定时器(Timer)和Ticker的用法,以及如何利用select实现斐波那契数列和超时机制。
摘要由CSDN通过智能技术生成

并发

41d9045ebe703997d781e00ed45eaf51.png

创建并发

新建一个携程

30fa9e746fe0bec208d38d510f3fb8d4.png

运行结果

5c257c8fd74bdff4442b723b22cfd97e.png

当主携程退出后,子携程也就退出了

12f383a94dfb925a86d1294789df86f9.png

例子;当主携程没有其他内容时,main 的主携程退出后,子携程直接退出了

3e00799428fb423d838a553031b65d8d.png

现象

0adbe1eb151ec481c7f9b14c5503cf96.png

868f20e745296d73a8db1ae27b0d477d.png

现象

fde378eb7ec5bc4c80a9211545a59fb7.png

Gosched()

加上 runtime.Gosched()之后

c775b4e1a9b67ea122ec4545b85cf041.png

现象 可见可以先执行其他线程 再其他线程执行完成之后再执行主线程

01bb1b80268b32a20b589e2b816c31a0.png

return终止函数的效果

e4f5fd7b44f9acc2d9fb3e0c1f581c15.png

效果

e1f2177da6aafa6f0234337c9c559b5b.png

Goexit()终止所在携程的作用

(所在的携程整个都终止)

49f73791fca4824f3b277bf2c3d54882.png

效果

9316fe13fdafcf763a092174ed15fe78.png

runtime.GOMAXPROCS(n)  指定以多少核运算

bc209697868166ca897872d35739ff26.png

多任务资源竞争问题

例子

d66c76c55b7d5d0a7bc596e833de2c65.png

效果

4835920c6d29c8e43c25e2467ae03925.png

打印结果分析

aa9a8be0dc351e16fee0649ba06d8d8c.png

chanel

43f9742e306ecfd43ab4befef489a760.png

a6550a99ce57bd86a019bf32e21a2a6f.png

207c73f48bc1fa70cff94c6529866956.png

channel的使用

5507f60bf386a7e1b5ba92df1d4e23cf.png

通过channel实现数据同步和数据交互

e1cab1b863e825c90a9a13ac073a9e46.png

使用无缓的冲通道在 goroutine之间同步

a2e6a1f658ef5dd463cda8f5a8bb0f53.png

3f1a5b1cd4512453964bd3acd4f6a2b9.png

实例

cdd3188e572499a02fcd01279603ccdc.png

有缓存channel

9ccca495e37dbc1e0888374b8b52b833.png

b61f6f71c9ad3a66858c8e9e2cf5de1c.png

运行效果

fec919ae3882240ccb04e6df727d7a2f.png

有缓冲channel超出容量后会阻塞

代码

b0f2c0c94b5c12f832be2f9c87413299.png

运行效果

9856bfe2e5687869fe8f3526b4602239.png

关闭channel

代码

608ba7ea7b5991c4acca7dbb35373657.png

运行结果

a4f7a4d1a8b1fd54c59553a64550b772.png

0326dbd3860a537acae9b918e158cac0.png

通过range遍历channel中的内容

9cf4a551ce424c4f4cef10a5ddf84117.png

结果

349fa76cd8c50c5e0689fb3a55488a85.png

单方向的channel

创建方式和特点

8cf0da19eadf3266cff94ac859199533.png

单向channel的应用

生产者消费者模型

3386450c316577d2e61cc1835ed5a242.png

定时器

005ac0e3fe18e40d28e80d687a6b20dc.png

实例代码 timer

4d0bdb91a9fcbb4715869cc6b90549fe.png

通过timer实现延时功能 和其他延时功能实现方式

b2a8f0e18644ff7b3f338f8ec50d328c.png

停止和重制定时器

9aa9ea1487ccca39e2b6a2242733a428.png

reset重新设定时间

6929249cb7cb618f66c9e9c1d57a6917.png

运行结果

c0ee6e04f419077b49310010b0774700.png

ticker的使用

c99e99d98a0e19a3f85abd7da98d66f5.png

2386cfa96a1b702f60132d4627cff991.png

运行结果

3af2a06451e580a7eb0d8b56becbcc28.png

select

ee155769360f98d277a92188fb1b12b4.png

1da35d106b74078f2206a90f8fbe3fd0.png

select的随机性

下面代码会触发异常吗?请详细说明

package mainimport("fmt"

"runtime")

func main() {

runtime.GOMAXPROCS(1)

int_chan := make(chan int, 1)

string_chan := make(chan string, 1)

int_chan

case value :=

fmt.Println(value)

case value :=

panic(value)

}

}

考点:select随机性

解答:

select会随机选择一个可用通用做收发操作。 所以代码是有可能触发异常,也有可能不会。 单个chan如果无缓冲时,将会阻塞。但结合 select可以在多个chan间等待执行。有三点原则:

select 中只要有一个case能return,则立刻执行。

当如果同一时间有多个case均能return则伪随机方式抽取任意一个执行。

如果没有一个case能return则可以执行”default”块。

使用select 实现斐波那契数列

f0c2872acb33f92feb4cf160b6ae4897.png

eaa08ad541b7751be4ff6fff91509d9a.png

运行结果

ba8c17f7bacc993bb8bc3efa81cfbdb1.png

select实现超时机制

代码

func main() {

ch :=make(chan int)

qui :=make(chan bool)

go func() {for{

select {

case num :=

fmt.Println("num=", num)

case

fmt.Println("超时了")

qui

}

}

}()for i := 0; i < 5; i++{

ch

}

fmt.Println("结束")

}

运行结果

num=0

num= 1num= 2num= 3num= 4超时了

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值