首页 > 编程语言 >golang并发编程(新手向)

golang并发编程(新手向)

时间:2024-07-24 14:42:22浏览次数:13  
标签:ch 编程 golang 并发 线程 go 新手 channel

golang 并发

所有工具的简单介绍

1 goroutine:
准确来说这并不是一个和C#Java一样的线程,而是golang runtime管理的一个轻量级线程,但是我们完全可以把他当做是一个线程,使用go关键字来开启
2 channel:
这是一种通信方式,相当于不同线程之间建立了管道通信的机制,管道有很多种,但是只要把握住核心功能“通信”,就不会感到迷茫,很巧妙的解决了共享内存的线程的诸多问题
3 select:
这相当于是对channel进行集中处理的工具,就像战争片里的指挥所里一群人在一起使用电报进行集中收发,当一个线程需要受到很多信息 或者说管道的影响的时候,必然需要对这些信息进行集中管理
4 sync包:
提供了一些工具,分别有各种锁 mutex,waitGroup,once,atomic……,这几个是主要的,mutex是解决并发运行的时候数据错乱的方式,类似于数据库遇到的各种幻读,脏读等情况,有了锁就能实现一些原子化操作,waitGroup相当于是一个计数器,wg.wait会一直等待,直到wg.Done调用的次数多余wg.Add(n) 的时候才会停止阻塞继续运行,once也和数量有关,一个once只能执行一次操作,atomic是一些已经写好了的原子化操作,比如a=a+1并不是原子化的,但是atomic.AddInt64(&a,1)就是原子化的,context可以理解为一种特殊的管道操作,不过专门负责控制取消线程。
可以看到这个包是对线程的具体内容进行控制
5 time包中的Ticker:
我认为这个也很重要,在一些涉及到时间的并发场景中这个会十分方便,比如轮询之类的操作。

goroutine

完全可以把他当做线程对待,使用go进行调用,一般使用两种姿势
go functionName(arguments)
或者
go func() {
// 函数体
}()

channel

最普通的channel创建:
var ch chan strign
ch=make(chan string)
销毁:
close(ch)
使用:
ch<-msg
msg:=<-ch
//这里有个注意,所有的使用方式都只能是<-向左,不像C++方向可以变<< 或者 >>
不管是发送还是接受信息的时候,这种最简单的管道在没有联系完成的时候会一直堵塞住,简单的来说,如果ch<-"hhha",会一直堵塞到有线程接收了这个hhha不然发送线程就会一直堵塞,同理,在接收线程的msg<-ch语句没有接收到信息的时候,也会一直堵塞住。而这种堵塞会一直持续,一直到什么时候联系完成或者通道关闭,关闭的时候,会直接给msg赋0值,比如string
就会是“”。

这是最基础的channel,为什么设计成这样,这是谷歌多年来无数代码总结的经验,这种方式牺牲了一部分并发的效率,但是出错的概率很小,虽然不够灵活,但是基本的功能其实已经完成了,golang完成异步编程的办法和C#等不一样,go接受了异步代码和同步不一样的事实,选择让开发者使用channel自己控制逻辑,我认为更灵活,并且,在最基础的channel上还加上一些升级功能,如下。

升级一:
双值接受,当通道关闭之后还没有接收到想要的内容,这往往意味着大事不妙,肯定要进行特殊处理并进行修复。这时候使用msg,ok:=<-ch,如果是因为ch关闭而停止的阻塞,那么ok会为false,开发者最好能在对可能出现提前关闭的channel进行处理时使用ok来报错提示

升级二:
这里引入buffered channel和unbuffered channel 的概念,最基础的channel就是unbuffered channel,我们可以在定义的时候make(chan int, 9)来创建buffered channel。
加入了缓冲区的channel的发送者在缓冲区爆满之前是不会堵塞的,而接受者还是会在接收不到的时候堵塞,其实为换句话说,sender被阻塞的时候,其实是没有发送成功的,只有被另一端读走一个数据之后才算是send成功,unbuffered其实也算是一种buffered,只是buffer为1

高级装逼用法,nil类型和channel类型的channel,一般用处不大,但是也存在这种用法

标签:ch,编程,golang,并发,线程,go,新手,channel
From: https://www.cnblogs.com/yangxiaoshuai/p/18320851

相关文章

  • Golang格式化占位符详解
    Golang格式化占位符详解在Golang编程中,格式化字符串是一种常见的操作,它可以用来将不同类型的数据格式化为字符串输出。在格式化字符串时,占位符起着至关重要的作用,通过占位符可以指定数据的输出格式。本文将详细介绍Golang中一些常用的格式化占位符,并提供具体的代码示例供大......
  • 以编程方式删除 Python 源中的类型提示
    我有一些为Python3.5编写的源代码,我想使其在Python3.4下可执行。我使用的3.5中唯一在3.4中不可用的功能是类型提示,因此我想编写一个脚本来完全删除这些功能。乍一看这似乎很容易,我决定编写一些正则表达式这样做,但后来我想到了一些边缘情况,我不确定如何解决像这样的......
  • Java并发编程实战读书笔记(四)
    显示锁Lock与ReentrantLockLock接口定义了一组抽象的加锁操作,与内置加锁机制不同,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。在Lock的实现中必须提供与内部锁相同的内存可见性语义,但在加锁语义、调度算法、顺......
  • Java并发编程实战读书笔记(二)
    对象的组合在设计线程安全的类时,确保数据的一致性和防止数据竞争是至关重要的。这通常涉及三个基本要素:确定构成对象状态的所有变量,明确约束这些状态变量的不变性条件,以及建立管理对象状态并发访问的策略。要确定构成对象状态的所有变量相对简单,但需注意状态应封装在对象......
  • 模块2 面向对象编程初级 --- 第六章:创建对象
    第六章创建对象主要知识点:1、类的实例化2、构造方法3、对象的使用4、对象的清除学习目标:根据定义的类进行实例化,并且运用对象编写代码完成一定的功能。本章对类进行实例化,生成类的对象,利用对象开始软件的设计过程,掌握对象的使用方法。6.1创建对象概......
  • python_网络编程_socket
    一、网络编程的基本概念通信协议:internet协议,任何私有网络支持此协议,就可以接入互联网二、七层协议与四层协议从下到上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层三、掌握TCP、IP协议ip协议是整个TCP、IP协议族的核心IP地址就是会联网上计算......
  • 某人有100,0000元,每经过一次路口,需要交费,规则如下: 1)当现金>50000时,每次交5% 2)当现
    1publicclassexercise08{2//编写一个main方法3publicstaticvoidmain(){4/*5某人有100,0000元,每经过一次路口,需要交费,规则如下:61)当现金>50000时,每次交5%72)当现金<=50000时,每次交100008编程计算该人可......
  • 编程与大语言模型的冷知识,你知道几个?
    目录1.ASCII中的“Hello,World!”2.Python的缩进规则3.JavaScript的“undefined”与“null”4.C++中的“this”指针5.PHP的魔术方法6.Go语言的并发模型7.最早的编程“虫子”8.Hello,World!的起源9.goto语句争议10.Python的命名11.隐藏的彩蛋12.最古老的编程语......
  • Python编程时输入操作数错误
    我正在用Python编写下面的代码来模拟控制系统。但是,当我调试代码时,我面临以下问题:matmul:输入操作数1没有足够的维度(有0,gufunc核心,签名为(n?,k),(k,m?)->(n?,m?)需要1)文件“D:\ÁreadeTrabalho\GitHub\TCC\CódigosMarcela\SistemaSISO_tres_estados_new.py”,......
  • 微信小游戏0基础学习记录:1.起步-制作简单游戏的新手引导(完成)
     前情提要: 微信小游戏0基础学习记录:0.一些准备知识&起步 上一篇博客介绍到了官方教程“制作简单游戏的新手引导”的第一阶段,“创建并编译3D场景”。这一篇将继续完成新手引导的剩余内容,包括2D场景的创建与编辑、游戏项目的播放与构建等等。官方文档:快速上手|微信开放......