协程(goroutine)和通道(channel)是其并发模型

简介: 协程(goroutine)和通道(channel)是其并发模型

在谈论 Golang(Go)的并发编程时,协程(goroutine)和通道(channel)是其并发模型的两个核心概念,是 Go 语言在处理并发任务时的重要工具。

协程(Goroutine)

协程是 Go 语言中的轻量级线程,由 Go 运行时(runtime)管理。与传统的操作系统线程相比,协程的创建和销毁成本非常低,因此可以轻松创建成千上万个协程,而不会对系统造成负担。

特点和用法

  • 轻量级:每个协程的栈空间默认很小(几 KB),因此创建和销毁速度非常快。
  • 并发执行:多个协程可以并发执行,由 Go 运行时调度在多核 CPU 上运行。
  • 使用方式:通过 go 关键字加上一个函数或方法调用来创建协程,例如:go myFunction()

示例

package main

import (
    "fmt"
    "time"
)

func sayHello() {
   
    fmt.Println("Hello from goroutine!")
}

func main() {
   
    go sayHello() // 启动一个协程
    time.Sleep(time.Second) // 等待协程执行完成
}

通道(Channel)

通道是用来在协程之间进行通信和同步的机制。通道提供了一种安全的方式,确保数据在发送和接收时不会被并发访问问题所破坏。通道可以是带缓冲的(缓冲通道)或非缓冲的。

特点和用法

  • 安全性:通道保证同一时刻只能有一个协程访问数据,从而避免了竞态条件。
  • 阻塞机制:发送和接收操作可以使协程阻塞,直到另一个协程准备好接收或发送数据。
  • 声明和操作:通过 make 函数创建通道,使用 <- 运算符发送和接收数据。

示例

package main

import "fmt"

func main() {
   
    ch := make(chan string) // 创建一个字符串类型的无缓冲通道

    go func() {
   
        ch <- "Hello from channel!" // 发送数据到通道
    }()

    msg := <-ch // 从通道接收数据
    fmt.Println(msg)
}

在这个示例中,主函数启动了一个匿名函数作为协程,向通道 ch 发送数据,并在主函数中从通道 ch 接收数据,最终打印出来。

总结

协程和通道是 Go 语言强大的并发编程工具,通过协程可以实现轻量级的并发执行,而通道则提供了安全且高效的协程间通信方式。这些特性使得 Go 语言在处理大规模并发任务和网络编程时非常高效和便利。

目录
相关文章
|
Go
【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)
【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)
2021 0
【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)
|
1月前
|
程序员 Go 数据处理
|
1月前
|
数据可视化 Go
|
1月前
|
存储 安全 Java
深入浅出Go并发之协程—goroutine
深入浅出Go并发之协程—goroutine
42 0
|
Java Go 调度
Golang中的协程(goroutine)
Golang中的协程(goroutine)
78 0
|
存储 安全 Java
深入浅出Go并发之协程—goroutine
深入浅出Go并发之协程—goroutine
|
Java 程序员 Go
grpool goroutine池详解 | 协程管理
goroutine协程非常轻量级,这也是为什么go支持高并发,但是goroutine频繁创建销毁对GC的压力比较大。
140 0
grpool goroutine池详解 | 协程管理
|
安全 程序员 调度
Goroutine 是什么?进程、线程、协程又是什么?有什么区别和联系?
进程,直观点说,保存在硬盘上的程序运行之后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。
141 0
Goroutine 是什么?进程、线程、协程又是什么?有什么区别和联系?
|
缓存 Linux 测试技术
对于操作系统而言进程、线程以及Goroutine协程的区别
进程、线程、协程实际上都是为并发而生。但是他们的各自的模样是完全不一致的,下面我们来分析一下他们各自的特点和关系。本文不重点介绍什么是进程和线程,而是提炼进程、线程、协程干货。且是基于Linux下的进程、线程解释。
196 0
对于操作系统而言进程、线程以及Goroutine协程的区别