Go 并发机制:Goroutine

Go 是当前一门热门的编程语言,其优秀的并发特性吸引了无数程序员的目光。

Go 的并发特性是一个比较大的话题,笔者计划从以下三个方面讨论:

  • Go goroutine
  • Go channel
  • Go select

本文讨论 Go 的 goroutine 并发机制。

并发与并行

在讨论 goroutine 之前,我们先来看下并发与并行的区别。

多线程程序在单核心的 cpu 上运行,称为并发;多线程程序在多核心的 cpu 上运行,称为并行。并发与并行并不相同,并发主要由切换时间片来实现“同时”运行,并行则是直接利用多核实现多线程的运行。

以生活中慢跑例子来说明并发与并行的区别。

一个人在进行慢跑,途中鞋带松了。这时,他停止跑步,系好鞋带,然后再继续跑步。这是并发的经典示例,即这个人能够处理跑步和系鞋带,可以理解为这个人可以“同时”(at onece)处理多个事情。

同样以慢跑来例子来说明并行的含义。假设一个人正在戴着 airpods 听音乐慢跑。在这种情况下,这个人同时(at the same time)进行慢跑和听音乐,这就是所谓的并行。

Go 使用 goroutine 和 channel 实现并发特性。

什么是 Goroutine

Goroutine 是一个轻量级的可独立运行的工作单元,可以看作是轻量级的线程。与线程相比,创建 goroutine 的成本很小,因此 go 应用程序通常会同时运行数千个 goroutine。

Goroutine 的优势

  • 创建 goroutine 的成本远小于线程。Goroutine 的栈大小只有几 KB,且可以根据应用程的需要增长和收缩。而对于线程,栈大小必须指定和固定下来
  • 多个 goroutine 可以复用一个操作系统的线程。在一个有数千个 goroutine 的程序中可能只有一个线程。如果一个线程由于 goroutine 等待用户输入而阻塞,则会创建一个新的线程,其余的 goroutine 也会移动到这个新的线程运行。这些对于程序员来说都是透明的
  • Goroutine 使用通道(channel)来通信。通道的使用可以防止访问共享内存时出现资源竞争的问题。有关通道的机制,我们在下一节进行描述

如何启动一个 Goroutine

为了启动一个 goroutine,只需要在函数或方法前面添加上 go 关键字,这样一来,我们就启动了一个 goroutine ,这个 goroutine 会并发地运行。

package main

import (  
    "fmt"
)

func hello() {
   
     
    fmt.Println("Hello world goroutine")
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值