[13th][Day5] Goroutine

about goroutine
要聊 golang 中的 「go」 这个保留字之前,先来说说 Goroutine 这东东

在 golang 中,每一个并发的执行单元叫作一个 goroutine。

在现在这个时空背景之下, CPU 的时脉已经逼近物理上限,不管是 AMD 或是 Intel 都往多核、多线程发展。

同理,单一的大型服务器相当昂贵,扩充不易,使用多台主机组成的丛集 (cluster) 成本比较容易控制。
but ... 若是 code 没有用到 concurrency 来写,就无法发挥平行处理 (parallel computing) 、无法享受到效能的提升。

Go 主要的特色之一,就在於其对并发性程序的支援;大部分程序语言以函式库来支援共时性程序,但 Go 将其内建在语法中。

以 goroutine 做为并发执行的程序码区块,goroutine 类似於执行绪,但更轻量,一次启动数百甚至数千个以上的 goroutine 也不会占用太多记忆体。要使用 goroutine,在函式前加上 go 关键字即可

用 goroutine 同时跑两个任务

	go mission1(ctx)
	go mission2(ctx)

也可以用 for 回圈起多个 goroutine

	for i := 1; i <= 10; i++ {
		go mission10(i)
	}

about chan

如果说 goroutine 是 Golang 的并发体的话,那麽 channels 就是他们之间的通信机制。一个 channel 是一个通信机制。每个 channel 都有一个特殊的类型,也就是 channels 可发送数值的类型。一个可以发送 int 的 channel 一般写为

chan int

channel 需要 make() 方法来创建

oneChannel := make(chan int)  

当一个资料需要在 goroutine 之间共享时,通道在 goroutine 之间架起一个管道,并提供确保同步交换数据的机制。宣告通道时,需要指定将要被共享的资料型态。可以透过 channel 共享 int, float, struct, pointer ... 等资料型态。

通过 channel 发送讯息
使用 make 创建一个 channel 後,就可以使用<- 向channel 发送资料,例子如下:

// 准备一个空接口通道
demoChan := make(chan interface{})
// 把 0 放入通道中
demoChan <- 0
// 把 hello 字串放入 channel 中
demoChan1 <- "hello"

使用 channel 接收讯息
阻塞接收
阻塞模式接收数据时,将接收变数指定到 <- 的左边的值

    data := <-ch

非阻塞接收

    data, ok := <-ch
    //多了判断是否接收到数据

任意接收

    <-ch

循环接收
通道的数据接收可以用 for range 的遍历方式

    for data := range oneChannel {
    }

select
select 是一种与 switch 相似的结构控制 but ....select 中虽然也有多个 case,但是这些 case 中的判断式必须都是 Channel 的收发操作。


<<:  [Day1] 前言

>>:  [第一话] 一切的开始,web assembly

Day24 让你的k8s Pod 具备多介面功能 - 实做篇

昨天简述了关於Multus CNI的使用需求和架构,今天我们来介绍Multus的环境建置和测试,此次...

Azure CLI 本质 Restful API

为何 Azure CLI / SDK / Portal / PowerShell 的行为可以一致,背...

DAY28 CNN(卷积神经网路 续二)

昨天介绍完CNN卷积神经网路正向传播程序,今天要来研究CNN卷积神经网路反向传播程序: 首先在上次全...

Day03 - 端到端(end-to-end)语音辨识

在前一天的最後有提到说透过类神经网路(DNN)使得从输入端到输出端只透过一个模型就完成语音辨识,像这...

Day 26 介绍 vite

vite 是 Vue.js 的作者所做的一个新的 bundler ,如果你有用过应该会知道,它最特别...