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等的使用的线程是抢占式调度的。

目录
相关文章
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
77 4
|
2月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
3天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
16 7
|
8天前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
8天前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
9天前
|
安全 Go 调度
探索Go语言的并发之美:goroutine与channel
在这个快节奏的技术时代,Go语言以其简洁的语法和强大的并发能力脱颖而出。本文将带你深入Go语言的并发机制,探索goroutine的轻量级特性和channel的同步通信能力,让你在高并发场景下也能游刃有余。
|
6天前
|
安全 程序员 Go
深入浅出Go语言的并发之道
在本文中,我们将探索Go语言如何优雅地处理并发编程。通过对比传统多线程模型,我们将揭示Go语言独特的goroutine和channel机制是如何简化并发编程,并提高程序的效率和稳定性。本文不涉及复杂的技术术语,而是用通俗易懂的语言,结合生动的比喻,让读者能够轻松理解Go语言并发编程的核心概念。
|
2月前
|
存储 安全 Go
Go to Learn Go之并发
Go to Learn Go之并发
28 8
|
2月前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
2月前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。