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 的收发操作。
昨天简述了关於Multus CNI的使用需求和架构,今天我们来介绍Multus的环境建置和测试,此次...
为何 Azure CLI / SDK / Portal / PowerShell 的行为可以一致,背...
昨天介绍完CNN卷积神经网路正向传播程序,今天要来研究CNN卷积神经网路反向传播程序: 首先在上次全...
在前一天的最後有提到说透过类神经网路(DNN)使得从输入端到输出端只透过一个模型就完成语音辨识,像这...
vite 是 Vue.js 的作者所做的一个新的 bundler ,如果你有用过应该会知道,它最特别...