go语言创建协程

前言

Go 语言中,协程是通过 go 关键字来创建的,这使得 Go 语言成为实现并发程序的一个非常直观和强大的工具。Go 运行时管理着协程,这些协程在内部被称为 goroutine。

协程(goroutines)本身是轻量级的线程,由 Go 运行时管理。它们设计为非阻塞的,因为 Go 运行时会在一个协程阻塞时(例如,由于I/O操作)自动切换到其他协程继续执行,从而提高程序的并发性能。

一、测试用例

Go 复制代码
package main

import (
	"fmt"
	"time"
)

// 定义一个函数,该函数将由协程执行
func printNumbers() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
		// 延时处理
		time.Sleep(100 * time.Millisecond)
	}
}

func main() {
	// 使用 go 关键字启动协程
	go printNumbers()

	// 非阻塞 主函数继续执行,不会等待协程完成
	for i := 0; i < 5; i++ {
		fmt.Printf("Main is running: %d\n", i)
		time.Sleep(200 * time.Millisecond)
	}

}

程序的退出依赖于主函数的结束,但在go语言中协程是并发运行的,它们有自己的执行栈和运行状态。如果协程在主函数结束后还在运行,它们将继续执行,直到协程执行完毕自然退出。

二、协程与通道的使用

Go 复制代码
package main

import (
	"fmt"
	"sync"
)

func consumer(id int, ch <-chan int, wg *sync.WaitGroup) {
	for n := range ch {
		fmt.Printf("Consumer %d received %d\n", id, n)
	}
	wg.Done()
}

func main() {
	ch := make(chan int)
	var wg sync.WaitGroup

	for i := 1; i <= 3; i++ {
		wg.Add(1)
		go consumer(i, ch, &wg)
	}

	for n := 1; n <= 9; n++ {
		ch <- n
	}
	close(ch)

	wg.Wait()
	fmt.Println("All consumers are done.")
}

协程(goroutines)和通道(channels)是并发编程的两个基本工具,经常结合在一起使用,以实现复杂的并发模式。协程是轻量级的线程;而通道提供了协程之间的通信机制。

以上的生产者-消费者模式:创建了三个消费者的协程,并往通道中写入数据,协程再将数据进行打印输出。通道用来在协程之间传递数据,也作为同步机制来控制协程的执行顺序。

相关推荐
热爱编程的小刘18 小时前
Lesson05&6 --- C&C++内存管理&模板初阶
开发语言·c++
Charlie_lll18 小时前
力扣解题-[3379]转换数组
数据结构·后端·算法·leetcode
qq_124987075319 小时前
基于Java Web的城市花园小区维修管理系统的设计与实现(源码+论文+部署+安装)
java·开发语言·前端·spring boot·spring·毕业设计·计算机毕业设计
VX:Fegn089519 小时前
计算机毕业设计|基于springboot + vue云租车平台系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
froginwe1119 小时前
Python 条件语句
开发语言
汤姆yu19 小时前
2026基于springboot的在线招聘系统
java·spring boot·后端
七夜zippoe19 小时前
Python统计分析实战:从描述统计到假设检验的完整指南
开发语言·python·统计分析·置信区间·概率分布
2601_9491465319 小时前
Python语音通知API示例代码汇总:基于Requests库的语音接口调用实战
开发语言·python
3GPP仿真实验室19 小时前
【Matlab源码】6G候选波形:OFDM-IM 索引调制仿真平台
开发语言·matlab
计算机学姐19 小时前
基于SpringBoot的校园社团管理系统
java·vue.js·spring boot·后端·spring·信息可视化·推荐算法