1.基于Golang协程实现流量统计系统-协程的学习

本文通过实例展示了如何利用Golang的协程与通道进行数据处理,包括单协程与多协程的工作流程,以及如何通过通道进行数据传递。

最近开始学习基于Golang协程实现流量统计系统之协程这套视频,把每天学习的内容总结成文章,第一方便今后复习使用,另外还让想学习的兄弟学习

这是一个例子1:

这就是最简单的goroutine的例子,单协程版

功能:

用goroutine往通道中放入一串字符串

然后从通道中取出该字符串输出打印出来

package main

import (
"fmt"
)

func main()  {
var message = make(chan string) //创建一个通道,单通道,只能1进1出
go func() { //创建一个goroutine
message <-"hello goroutine1" //往通道中写入字符串,此时通道阻塞
}()

fmt.Println(<-message) //从通道中取出数据,此时取出的是刚才写入的字符串,然后输出打印出来。
fmt.Println("helloworld!")
}

输出结果:

hello goroutine1
helloworld!

这是对的

接下来我们改进一下,改成两个goroutine同时运行

功能:

第一个goroutine往message写入字符串,

另一个goroutine取出字符串,

并将字符串和另一个字符串进行拼接,再写入message通道中,

然后在main主函数中取出message通道中的拼接过的字符串,输出打印出来。

代码实现:


package main

import (
"fmt"
   "time"
)

func main()  {
//创建通道
var message = make(chan string)
go func() { //第一个goroutine往通道中写入
message <-"hello goroutine"
}()
go func() {
str:=<-message//第二个goroutine从通道中取出字符串
str=str+",i am goroutine!" //将取出的字符串拼接成新的字符串
message<-str //将新的字符串重新写入到message通道中
}()
time.Sleep(3*time.Second) //这里需要睡3秒,否则main goroutine直接就输出第一个goroutine的内容就直接returnfmt.Println(<-message) //通道中取字符串并输出打印
fmt.Println("helloworld!")
}

运行结果:

hello goroutine!,i am goroutine!
helloworld!

没有问题


以上是单通道版本,考虑一下能不能多个通道同时运行呢?答案是可以的。现在我们来演示一下

代码如下:


package main

import (
"fmt"
   "time"
)

func main()  {
//创建通道
//goroutine的原则是FIFO,first in first out,先进先出,所以第一个message会先写入到通道message//然后进行字符串拼接,拼接后直接main函数中打印输出了,当goroutine1输出后,其它goroutine就没机会拼接字符串了
//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值