golang并发编程之channel(代码片段)

author author     2023-01-10     439

关键词:

一、概念
channel是golang语言级别提供的协程(goroutine)之间的通信方式。
goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。

二、声明方式

    var chanName chan ElementType
    var ch chan int
    使用make,可以指定channel容量
    ch = make(chan int)

三、channel得读和写
channel通过操作符<-来接收和发送数据

ch <- v    // 发送v到channel ch. 写数据
v := <- ch // 从ch中接口数据,并赋值给v 读数据

默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel是在多个goroutine之间同步很棒的工具。

四、code

package main

import (
    "fmt"
    "strconv"
)

//定义一个加法函数,传入channel类型,每计算一次,quit加1
func Add(x, y int, quit chan int)  
    z := x + y
    fmt.Println(z)

    //写数据
    quit <- 1



//接受数据,并赋值给我
func Read(ch chan int)  
    value := <- ch

    fmt.Println("value" + strconv.Itoa(value))



func Write(ch chan int)  
    //ch <- 10



func main()  

    //定义一个channel类型切片数组
    chs := make([]chan int, 10)

    //循环执行加法函数
    for i := 0; i < 10; i++ 
        //拿取一个channel
        chs[i] = make(chan int)
        //执行goroutine和发送一个channel类型数据
        go Add(i, i, chs[i])
    

    for _, v := range chs 
        //接口channel类型数据
        <- v
    

go语言自学系列|golang并发编程之channel的遍历(代码片段)

视频来源:B站《golang入门到项目实战[2021最新Go语言教程,没有废话,纯干货!持续更新中...]》一边学习一边整理老师的课程内容及试验笔记,并与大家分享,请移步至知乎网站,谢谢支持!附上... 查看详情

go语言学习之旅--并发编程

...time包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之Timergolang并发编程之原子变量的引入golang并发编程之原子操作详 查看详情

go语言学习之旅--并发编程

...time包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之Timergolang并发编程之原子变量的引入golang并发编程之原子操作详 查看详情

go语言学习之旅--并发编程

...time包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之Timergolang并发编程之原子变量的引入golang并发编程之原子操作详解golang并发编程之协程https://blog.csdn.net/guolianggsta/article... 查看详情

golang并发编程之生产者消费者(代码片段)

golang最吸引人的地方可能就是并发了,无论代码的编写上,还是性能上面,golang都有绝对的优势学习一个语言的并发特性,我喜欢实现一个生产者消费者模型,这个模型非常经典,适用于很多的并发场景,下面我通过这个模型,... 查看详情

golang之goroutine和channel(代码片段)

多线程程序在单核上运行,就是并发多线程程序在多核上运行,不是并行Go协程和Go主线程  Go主线程(线程):一个Go线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程  Go协程的特点:    1)有独立的... 查看详情

go语言自学系列|golang并发编程之selectswitch(代码片段)

...itch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。select的case语句必须是一个channel的操作select的default子句总是... 查看详情

go语言自学系列|golang并发编程之mutex互斥锁实现同步(代码片段)

...|汇总-知乎(zhihu.com)https://zhuanlan.zhihu.com/p/484035621除了使用channel实现同步之外,还可以使用Mutex互斥锁的方式实现同步。packagemainimport("fmt""sync""time")varmint=100varlocksync.Mutexvarwtsync.WaitGroupfuncadd()deferwt.Done()lock.... 查看详情

go_csp并发模型(代码片段)

...代提出的,用于描述两个独立的并发实体通过共享的通讯channel(管道)进行通信的并发模型。相对于Actor模型,CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。严格来说,CSP是一门形式语言... 查看详情

golang学习随便记9(代码片段)

goroutine和channel (1)golang有两种并发编程风格,基于CSP的goroutine+channel或者传统的共享内存多线程模型。毫无疑问,goroutine和channel是golang引以为傲的东西,虽然背后理论不是革命性的东西,但它足够有... 查看详情

并发编程如果用channel解决并发问题?(代码片段)

...河系】期待你的关注。未来大家一起加油啊~前言什么是Channel?在Go语言基础中应该就学过Channel,那个时候应该都认为只是一个基础类型,是一个管道一样类似的东西,方便快速读写操作,但是Channel在并发中... 查看详情

golang语言并发与并行——goroutine和channel的详细理解(代码片段)

  如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库来新建线程,还要用线程安全的队列库来共享数据。以下是我... 查看详情

在golang中是锁或channel还是atomic(代码片段)

  与其他编程语言一样在并发环境下如不对多个goroutine(线程)访问或修改的共享资源元素的进行控制,让进入临界区的对象互斥。就可能会出现数据异常情况;  一个非线程安全对象如下,如不对Id的访问进行控制,多个g... 查看详情

[golang]channel通道(代码片段)

说明channel是go当中的一个核心类型,可以看做是管道。并发核心单元可以通过channel进行数据的发送和接收,从而实现通信。在go中,channel是一种数据类型,主要被用来解决协程的同步问题以及协程之间数据共享(数据传递)的问题... 查看详情

如何优雅的关闭golang的channel(代码片段)

HowtoGracefullyCloseChannels,这篇博客讲了如何优雅的关闭channel的技巧,好好研读,收获良多。众所周知,在golang中,关闭或者向已关闭的channel发送数据都会引发panic。谨遵优雅关闭channel的原则不要在接受一端关闭channel不要在有多个... 查看详情

golang入门到项目实战golang并发变成之通道channel

参考技术AGo提供了一种称为通道的机制,用于在goroutine之间共享数据。当您作为goroutine执行并发活动时,需要在goroutine之间共享资源或数据,通道充当goroutine之间的管道(管道)并提供一种机制来保证同步交换。根据数据交换的... 查看详情

go并发编程基础-channel(代码片段)

协程(Goroutine)Go语言中没有线程的概念,只有协程,也称为goroutine。相比线程来说,协程更加轻量,一个程序可以随意启动成千上万个goroutine。goroutine被Goruntime所调度,这一点和线程不一样。也就是说,Go语言的并发是由Go自己... 查看详情

go语言之并发编程channel

单向channel:单向通道可分为发送通道和接收通道。但是无论哪一种单向通道,都不应该出现在变量的声明中,假如初始化了这样一个变量varuselessChanchan<-int=make(chan<-int,10)这样一个变量该如何使用呢,这样一个只进不出的通道... 查看详情