协程(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 语言在处理大规模并发任务和网络编程时非常高效和便利。

目录
相关文章
|
17天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
38 4
|
Go
【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)
【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)
2191 0
【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)
|
17天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
23 4
Golang语言goroutine协程篇
|
25天前
|
NoSQL Unix 编译器
Golang协程goroutine的调度与状态变迁分析
文章深入分析了Golang中goroutine的调度和状态变迁,包括Grunnable、Gwaiting、Grunning和Gsyscall等状态,以及它们之间的转换条件和原理,帮助理解Go调度器的内部机制。
28 0
|
4月前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
4月前
|
程序员 Go 数据处理
|
4月前
|
数据可视化 Go
|
4月前
|
存储 安全 Java
深入浅出Go并发之协程—goroutine
深入浅出Go并发之协程—goroutine
56 0
|
Java Go 调度
Golang中的协程(goroutine)
Golang中的协程(goroutine)
89 0
|
Go 调度 Python
大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14
众所周知,Go lang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象,然后把这个对象的指针传入某个通道变量中,另外一个协程从这个通道中读出变量的指针,并处理其指向的内存对象。
大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14