`

go语言的协程goroutine(一)

    博客分类:
  • Go
 
阅读更多
package main
import "fmt"
import "time"
import "sync"
import "runtime"

/*
golang中一个goroutine(协程)默认占用的内存远比java、C的线程少,操作系统线程一般都有固定的栈内存,通常为2M

一个goroutine占用的内存非常小,一般为2k,多协程切换调度开销远比多线程小

*/


/*
以下代码的问题:如果主线程执行结束,不管协程是否执行完成都退出

通过sync.WaitGroup可以实现主线程等待协程执行完毕
*/

var wg sync.WaitGroup

//主线程和goroutine同时执行

func test(){
	for i:=0;i<10;i++{
		fmt.Println("test() golang")
		time.Sleep(time.Millisecond*100)
	}

	wg.Done()//协程的计数器减1
}


func main() {

	wg.Add(1) //协程的计数器加1
	go test()  //开启一个goroutine

	for i:=0;i<10;i++{
		fmt.Println("main() golang")
		time.Sleep(time.Millisecond*50)
	}

	wg.Wait()  //主线程等待协程执行完毕然后退出
	fmt.Println("main exit")


	cpuNume := runtime.NumCPU()  //获取cpu核数
	fmt.Println("cpuNume=",cpuNume)

	runtime.GOMAXPROCS(cpuNume-1) //设置使用多个cpu


}
package main
import "fmt"
import "time"
import "sync"

/*
通过sync.WaitGroup可以实现主线程等待协程执行完毕
for循环开启多个goroutine
*/

var wg sync.WaitGroup

func test(x int){
	defer wg.Done()
	for i:=0;i<5;i++{
		fmt.Printf("协程%v打印出第%v个值\n",x, i)
		time.Sleep(time.Millisecond*100)
	}
}


func main() {

   //循环开启多个goroutine
	for i:=0;i<5;i++{
		wg.Add(1) //协程的计数器加1
		go test(i)
	}

	wg.Wait()  //主线程等待协程执行完毕然后退出
	fmt.Println("main exit")

}

 

分享到:
评论

相关推荐

    Go语言协程goroutine和管道channel教程.PDF

    ### Go语言协程goroutine与管道channel教程 #### 一、引言 Go语言作为一种现代编程语言,以其简洁高效的语法和强大的并发模型受到广大开发者的喜爱。其中,协程(goroutine)和管道(channel)是Go语言实现高效并发...

    Go语言之goroutine协程详解.md

    Go语言之goroutine协程详解.md

    Golang协程与Goroutine:并发编程的双生子

    Golang,通常被称为Go语言,是一种由谷歌开发的编程语言。它以简洁、高效、安全著称,并且非常适合构建大规模的分布式系统和微服务。Go语言的一些主要特点包括: 1. **简洁性**:Go语言的语法非常简单,易于学习。 ...

    Go语言协程流量统计(百度云盘)

    Go语言通过`goroutine`关键字创建协程,通过`channel`进行协程间的通信,从而实现了高效、简洁的并发编程模型。 #### 三、流量统计需求分析 流量统计是许多互联网服务的重要组成部分,它可以帮助我们了解用户的...

    Go-一个基于golang实现的协程安全的mysqlbuilder

    `Go-一个基于golang实现的协程安全的mysqlbuilder`项目旨在提供一个高效、安全且线程安全的MySQL查询构造器,尤其适用于并发环境中。该项目可能包含源码、示例和文档,帮助开发者更好地理解和使用这个库。 首先,...

    go 实现的通用协程池

    在Golang中,协程(goroutine)是并发执行的轻量级线程,它们使得程序能够并行处理多个任务,极大地提高了效率。而协程池(Coroutine Pool)则是一种管理协程的机制,用于控制并发量,防止过多的协程同时运行导致...

    浅谈go协程及其调度模型

    go在语言层面对协程进行了原生的支持并且称为goroutine,这也是go语言强大并发能力的重要支撑。 本文并非一蹴而就,后续随着知识及理解的不断深入将持续补充进来。同时也欢迎各位留言探讨,互相学习。 目录 进程、...

    Go-今日热榜是一个获取各大热门网站热门头条的聚合网站使用Go语言编写多协程异步快速抓取信息

    Go语言,又称为Golang,是Google在2009年推出的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。它以其简洁的语法、高效的性能以及对并发编程的强大支持而备受开发者喜爱。在“今日热榜”这个项目中,Go...

    Go并发编程之协程及其调度机制

    【Go并发编程之协程及其调度机制】 ...总结来说,Go语言的goroutine和通道机制为并发编程提供了一种高效且易于管理的途径。通过理解和熟练运用这些特性,开发者可以构建出性能优秀且易于维护的并发程序。

    Go示例学--通过示例学习Golang语言

    Go语言是一种静态类型、编译型、并发型、垃圾回收的编程语言,由Google开发。Go语言的设计目标是想创造一门 expressive、简单、可靠、快速、并发安全的语言。Go语言的parallelism和concurrency特性使其非常适合现代...

    Golang协程调度器原理与GMP设计思想

    协程是Go语言中的轻量级线程,调度器的任务是高效地将这些协程分配到操作系统线程上执行。调度器主要的目标是最大化CPU利用率和最小化上下文切换的开销。 2. GMP模型 GMP模型是Golang调度器的核心设计思想,分别...

    Golang协程调度器详解

    总结来说,Golang协程调度器详解这篇论文为读者提供了深入理解Go语言背后协程调度机制的机会,同时提出了一些基于竞争感知调度技术的扩展思路,这些思路旨在提升Go运行时的性能和可扩展性。这些内容对于深入理解Go...

    深入浅析python 协程与go协程的区别

    Go语言的协程(Goroutine)同样内置在语言中,使用`go`关键字创建。Go的并发模型基于CSP(Communicating Sequential Processes),强调通过通道(Channel)进行同步和通信,而非共享内存。这种模型减少了数据竞争的...

    Go-一个golang的任务协程池简单实现

    在Golang中,协程(goroutine)是轻量级线程,它们是Go语言并发模型的核心组成部分。协程池是一种管理并发任务的机制,它允许我们限制同时运行的协程数量,避免过度消耗系统资源。本文将详细介绍如何在Go语言中实现...

    Go语言15套教程(百度网盘)

    - **并发模型**:深入理解Go语言的并发模型,包括goroutine和channel的使用技巧。 - **内存管理**:探讨Go语言中的垃圾回收机制及其对性能的影响。 - **错误处理**:介绍Go语言特有的错误处理方式,如使用error类型...

    Go-ants是一个高性能的协程池实现了对大规模goroutine的调度管理goroutine复用

    Go-ants是一个专门为Go语言设计的高性能协程池库,其主要目标是提供一种有效的方式来管理大规模的goroutine,以优化并发程序的性能。在Go语言中,goroutine是一种轻量级的线程,它使得并发编程变得简单而高效。然而...

    Go 语言源码剖析_文字版.pdf

    4. 通道通信:通道(channel)是Go语言中用于协程(goroutine)间通信的原语。文档中提到了通道的创建、收发机制等,强调了通道在并发编程中的重要性。 5. 延迟调用与析构:延迟调用(defer)是Go语言中的一种特性...

    Go语言实战_golang教程_Go_go_

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。它旨在提高编程效率,简化系统编程,并且能够支持大规模的网络服务和分布式计算。Go语言实战教程是学习Go...

    Go语言程序设计

    Go语言(通常称为Golang)是由Google开发的一种开源编程语言,它在2009年首次发布,并迅速获得了业界的关注,特别是在分布式系统、云服务、微服务架构等领域的应用中脱颖而出。 ### Go语言的基础知识点 1. **...

Global site tag (gtag.js) - Google Analytics