首页 > 其他分享 >golang channel Synchronization

golang channel Synchronization

时间:2023-07-12 13:56:10浏览次数:43  
标签:接收数据 make goroutine chan golang Synchronization 接收 channel 通道

在 Go 语言中,通道(channel)是一个很重要的并发同步机制,可以用来在不同的 goroutine 之间发送和接收数据。

通道实现了一个先进先出(FIFO)的数据结构,所以可以确保数据的接收顺序与发送顺序一致。此外,通道的发送和接收操作都是原子的,这意味着你不需要额外的锁来同步数据访问。
这里有几种不同的方式可以用通道来同步 goroutines:

等待消息
你可以在一个 goroutine 中发送数据,然后在另一个 goroutine 中接收数据。接收操作会阻塞,直到有数据可以接收。

message := make(chan string)

go func() {
    message <- "ping"
}()

msg := <-message
fmt.Println(msg)

在上面的例子中,主 goroutine 会在 msg := <-message 这一行阻塞,直到子 goroutine 向 message 通道发送了数据。

等待通道关闭
发送者可以关闭通道来表示不会有更多的数据发送了。接收者可以使用 for-range 循环来接收数据,直到通道被关闭。

package main

import "fmt"

func main() {
	jobs := make(chan int, 5)
	done := make(chan bool)

	go func() {
		for {
			_, more := <-jobs
			if more {
				fmt.Println("received job")
			} else {
				fmt.Println("received all jobs")
				done <- true
				return
			}
		}
	}()

	for i := 1; i <= 3; i++ {
		jobs <- i
		fmt.Println("sent job", i)
	}
	close(jobs)
	fmt.Println("sent all jobs")

	<-done
}

在这个例子中,主 goroutine 会在最后的 <-done 这一行阻塞,直到子 goroutine 向 done 通道发送了数据。
使用通道来实现锁:虽然 Go 语言提供了 sync.Mutex 来实现互斥锁,但有时你也可以使用通道来实现类似的效果。例如,你可以创建一个只能存储一个元素的无缓冲通道,然后通过发送和接收操作来实现锁的获取和释放。

mutex := make(chan struct{}, 1)

mutex <- struct{}{} // 获取锁
// critical section
<-mutex // 释放锁

在这个例子中,尝试向 mutex 通道发送数据会阻塞,直到通道中的数据被接收。这就实现了类似于互斥锁的效果。

标签:接收数据,make,goroutine,chan,golang,Synchronization,接收,channel,通道
From: https://www.cnblogs.com/faberbeta/p/17547300.html

相关文章

  • 跟着 GPT-4 从0到1学习 Golang 并发机制(二)
    btw:我的个人博客网站目录一、前言二、开聊2.1Golang中的sync包-Mutex,RWMutex和WaitGroup2.2条件变量sync.Cond2.3sync.Cond的Broadcast()方法2.4原子操作Atomic2.5context包三、总结一、前言话接上回《跟着GPT-4从0到1学习Golang并发机制(一)》,我想......
  • 【Netty】「源码解析」(三)设置连接超时:深入分析 ChannelFuture.sync() 的执行过程
    前言本篇博文是《从0到1学习Netty》中源码系列的第三篇博文,主要内容是深入分析连接超时的实现原理,包括了connect方法的源码解析和ChannelFuture.sync()执行过程的解析。,往期系列文章请访问博主的Netty专栏,博文中的所有代码全部收集在博主的GitHub仓库中;介绍在实际应用中,当......
  • 跟着 GPT-4 从0到1学习 Golang 并发机制(一)
    目录一、前言二、开聊2.1Golang里的并发机制介绍2.2Goroutine与线程2.3Goroutine与线程的调度开销2.4用户态和内核态2.5Golang并发编程相关的知识点2.6Select语句2.7Select语句的default使用场景三、总结一、前言今天玩点不一样的,我想试试看GPT-4能不能当好一......
  • Golang学习笔记-判断
    判断有两种:if和switchif判断if用于条件判断,它会按照顺序一次执行,当if条件及elseif条件都不成立,则会执行else部分的逻辑语法if条件判断{...}elseif条件判断{...}else{...}栗子varmoneyint=18ifmoney>0&&money<=1000{fmt.Pri......
  • Golang学习笔记-常量
    声明常量声明常量关键字:constconst{常量名}{常量类型}或const{常量名}={常量值}预定义常量预定义常量:true,false,iota其中true,false是布尔类型,iota是一个自增常量,从0开始取值它每出现一次,它自身的值会加1iota用法const{ money0=iota//值为0......
  • Golang学习笔记-变量
    声明变量声明变量关键字varvar{变量名称}{变量类型}例子//声明一个变量为v1的整型变量,未赋值时默认值为0varv1int//声明一个变量为v2的浮点型变量,未赋值时默认值为0varv2float32//声明一个变量为v3的数组变量(数组中的元素为整型),未赋值时默认值为nilvarv3......
  • golang GRPC example
    REF:  GolanggRPCExampleGoinstallationweshouldbetterbuildinagolangcontainer https://go.dev/doc/install#https://go.dev/dl/go1.20.2.linux-amd64.tar.gzwgethttps://go.dev/dl/go1.20.2.linux-amd64.tar.gz#wgethttps://golang.org/dl/go1.18.li......
  • golang 使用ffmpeg工具实现音视频转码
    1ffmpeg工具是什么FFmpeg即是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种多彩格式转换、多种采样率转换、多种码率转换......
  • golang struct interface 方法
    有一个结构体typemystructstruct{aint}如果想为这个结构体增加一个方法,就类似于C++或者Java的类一样,有成员变量,也有成员函数,怎么实现呢?由于go没有类的概念,所以提供了一种方案。func(msmystruct)test()int{returnms.a}就是按照定义函数的方式,只不过在前面......
  • Dockerfile加载cache提速制作golang业务镜像
    Dockerfile#syntax=docker/dockerfile:1.2FROMgolang-1.18.5:ubuntu-22.04ASbuilderENVCGO_ENABLED0ENVGOOSlinuxENVGOPROXYhttps://goproxy.cn,directWORKDIR/build/COPYgo.*.RUNgomoddownloadCOPY..RUN--mount=type=cache,target=/root/.......