Go协程并发之百万级并发「让我们一起Golang」

简介: Go协程并发之百万级并发「让我们一起Golang」

Go协程并发之百万级并发「让我们一起Golang」

前面我们介绍了关于Golang的协程并发的一些理论知识,接下来我们上代码,通过代码带大家了解一下Go的协程并发,体验Go的百万级并发。

我们先来了解一下进程、线程、协程的区别吧!

进程有自己独立的堆和栈,而线程虽然拥有独立的栈,但是它的堆是共享的。而我们这里要讲的协程和线程是一样的,也是只共享堆,而不共享栈。但是协程不像进程和线程那样由操作系统调度,而是由程序员来调度,这样就可以节省资源,提高性能。

下面来看看主协程和一条协程在并发执行时的表现吧!

func main()  {
    go func() {
        for{
            fmt.Println("i am coroutine")
            time.Sleep(time.Second)
        }
    }()

    for{
        fmt.Println("我是主协程")
        time.Sleep(time.Second)
    }
}

他们运行结果是:

我是主协程
i am coroutine
i am coroutine
我是主协程
我是主协程
i am coroutine
i am coroutine
我是主协程
i am coroutine
我是主协程

我们可以看到,他们并不是顺序执行的,而是并发执行的,这就是协程并发。

func main() {
    //但是开启100条小协程是主协程干的
    //迅速开启100条小协程
    for i:=0;i<10;i++{
        go doSomething("面包人"+strconv.Itoa(i))
    }

    for{
        fmt.Println("我是主协程")
        time.Sleep(time.Second)
    }
}

func doSomething(grname string)  {
    for{
        fmt.Println("来了一车",grname)
        time.Sleep(time.Second)
    }
}
来了一车 面包人0
来了一车 面包人7
来了一车 面包人8
我是主协程
来了一车 面包人2
来了一车 面包人6
来了一车 面包人3
来了一车 面包人1
来了一车 面包人5
来了一车 面包人9
来了一车 面包人4
来了一车 面包人0
来了一车 面包人8
来了一车 面包人1
来了一车 面包人2
来了一车 面包人4
来了一车 面包人7
来了一车 面包人3
来了一车 面包人9
来了一车 面包人5
我是主协程
来了一车 面包人6
来了一车 面包人1
来了一车 面包人4

这里体验的是11条协程并发。是主协程唤起了十条协程,然后才有一车车面包人来打你。因此主协程是那个打电话喊面包人打你的人。也就是说主协程开启了10条协程。但是这十一条协程是并发的,他们不是顺序执行的。虽然是并发执行的,但是在微观上每次还是只能执行一条协程,但是他们的执行顺序和创建顺序是不一致的。

然后将

for i:=0;i<10;i++{
        go doSomething("面包人"+strconv.Itoa(i))
    }

改为

for i:=0;i<1000000;i++{
        go doSomething("面包人"+strconv.Itoa(i))
    }

这就是百万级并发了!

一个主协程可以喊100万车面包人打你。

经过测试,程序持续1分钟都没有崩溃。事实证明,执行协程只需要消耗极少的内存和CPU资源,所以我们可以创建一百万条协程。16G内存的电脑,用JAVA,C来做并发,差不多也就千级并发,而用GO语言,通过管道可以让并发能力得到很大提升,我们这里实现了百万级并发。

goroutine是协作式调度的,而Java等的使用的线程是抢占式调度的。

目录
相关文章
|
3月前
|
Go 开发者
go-carbon v2.6.0 重大版本更新,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持
85 3
|
9月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
186 4
|
7月前
|
存储 安全 测试技术
GoLang协程Goroutiney原理与GMP模型详解
本文详细介绍了Go语言中的Goroutine及其背后的GMP模型。Goroutine是Go语言中的一种轻量级线程,由Go运行时管理,支持高效的并发编程。文章讲解了Goroutine的创建、调度、上下文切换和栈管理等核心机制,并通过示例代码展示了如何使用Goroutine。GMP模型(Goroutine、Processor、Machine)是Go运行时调度Goroutine的基础,通过合理的调度策略,实现了高并发和高性能的程序执行。
422 30
|
7月前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
180 4
|
7月前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
184 6
|
7月前
|
Go 计算机视觉
在Golang高并发环境中如何进行协程同步?
在此示例中,使用互斥锁来保护对共享计数器变量 c 的访问,确保并发的 HTTP 请求不会产生数据竞争。
130 3
|
7月前
|
负载均衡 算法 Go
GoLang协程Goroutiney原理与GMP模型详解
【11月更文挑战第4天】Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,创建和销毁开销小,适合高并发场景。其调度采用非抢占式和协作式多任务处理结合的方式。GMP 模型包括 G(Goroutine)、M(系统线程)和 P(逻辑处理器),通过工作窃取算法实现负载均衡,确保高效利用系统资源。
124 3
|
7月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
135 4
|
8月前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
9月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
346 4
Golang语言goroutine协程篇

推荐镜像

更多