go并发中select的示例分析

技术go并发中select的示例分析这篇文章给大家分享的是有关go并发中select的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言介绍:对于Go语言并发通讯,是使用的协程go

本文将与您分享go concurrency中select示例分析的内容。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。

00-1010对于Go语言中的并发通信,使用协同学goroutine,而协同学之间的通信使用channel。但是,无论通道缓存还是不缓存,都会出现拥塞,但没有缓存的拥塞会更频繁。但是协同过程长期被阻断后,Go语言本身并没有提供这种超时解决机制,所以开发者需要考虑自行实现这种超时机制。这个超时机制是通过在Go语言中选择来解决的。

相关背景知识:

1.围棋语言并发文章(1):围棋句子文章:https://mp.weixin.qq.com/s/FD-MP9r5sEn1QYRAYZE_4g

2.GO语言中goroutine的调度原则:https://mp.weixin.qq.com/s/hTgIyJN7p-wrDfLj1bP1wQ

3.Go并发频道:https://mp.weixin.qq.com/s/PIb-gGBootc6581pHhi5ew

00-1010我们先来看几个问题。什么是选择?它的特点是什么?

语法定义:

选择Go是语言中的控制语句。它由select、case和default组成,类似于switch的编写方式。

Select仅用于读写操作通道。

(注意:golang的select本质上是监控IO操作,当IO操作发生时触发相应的动作。它也是一种常用的复用方式,如poll、epoll(这将在另一篇文章中介绍)、select)

示例:

go并发中select的示例分析

Select的特性:

1.如果只计算并传递了一个case语句,那么在这种情况下执行该语句。

2.如果评估并传递了多个case语句,则通过伪随机随机选择一个。

3.如果除default之外的case语句未能通过评估,则默认执行这些语句。

4.如果没有默认值,代码块将被阻止,直到一个案例通过评估;否则,它会一直阻塞。

特征1:的示例选择可以评估和通过的正常情况:

go并发中select的示例分析

没有默认分支和选择阻止的功能4:的示例:

go并发中select的示例分析

与功能1相比,我们会发现,当select无法检测到案例正在接收c1数据时,它会在哪里阻塞,并且不会打印“go end!”

属性3:有一个默认示例:

go并发中select的示例分析

如果select中有default,如果case未命中,将直接进入默认分支,协同过程也将结束,不会阻塞。

当同时满足23360多个案例时,随机抽取一个案例。

go并发中select的示例分析

从输出可以看出,虽然通道c1和c2基本上同时向通道写入数据,但select选择了c2,忽略了c1。

00-1010在阅读了select的特性后,作者知道了如何使用channel。但是你到底什么时候用select呢?于是作者又问了自己一个问题。

select有哪些应用场景,为什么需要select?

场景一:实现无阻塞读写操作。

根据select的特性3(如果default以外的case语句没有通过评估,那么执行default中的语句),我们可以实现无阻塞读写操作。

当服务器不希望用户继续向用户推送数据时,通常会出现这种情况。

阻塞在读操作上面。代码实例参考特性3的例子,我们利用default来跳过这个阻塞过程。

场景二: 为请求设置超时时间。

这一个场景也就是前言介绍里面提到的协程通讯时候,长时间收不到读写操作,导致协程一直被阻塞的情况,而超时机制则是一个很常规的操作。我们来看下例子:

1.复现channel阻塞的例子:

go并发中select的示例分析

2.超时处理的例子:

go并发中select的示例分析

例子1,因为channel中没有数据可读,导致协程一直阻塞住,并没有go end的日志打印出来。

例子2, 虽然channel 中依然没有数据可读,但是我们实现了超时机制,在2s超时之后,select会触发超时相关的channel,进而结束协程go的阻塞,打印出go end日志。

场景三: 调度协程,控制其他协程的退出或者完成

在并发程序中,通常 main goroutine 将任务分给其它 goroutine 去完成,而自身只是起到调度作用。这种情况下,main goroutine无法知道 其它goroutine 任务是否完成,此时我们需要 done channel来协助完成。

例子为:

不实用done channel的方式,会发现main的goroutinue并不会等待其他的goroutine结束之后,才结束,也不知道其他的goroutiue何时结束。

go并发中select的示例分析

添加了done channel之后,main goroutinue可以等待其他的goroutinue结束之后,再结束。

go并发中select的示例分析

感谢各位的阅读!关于“go并发中select的示例分析”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/99782.html

(0)

相关推荐

  • Spring源码中的配置文件分析

    技术Spring源码中的配置文件分析本篇内容介绍了“Spring源码中的配置文件分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够

    攻略 2021年11月15日
  • 香港VPS or 香港服务器 如何选择

    技术香港VPS or 香港服务器 如何选择选择香港地区的IDC产品搭建网站有不少选择,比较常用的是香港服务器和香港VPS,那么二者之间有什么区别,应该如何选择呢,下面就来简单介绍一下香港VPS 香港VPS租用是一个常见的

    礼包 2021年12月15日
  • 指甲油怎么卸掉,卸指甲油不伤指甲的方法

    技术指甲油怎么卸掉,卸指甲油不伤指甲的方法每个女孩子都爱美,经常会看见女孩们指甲盖上涂一层美甲以此来增加自己的自信度,下面为卸指甲油不伤指甲的方法介绍指甲油怎么卸掉:1、涂指甲油之前在自己的指甲上涂一层宝宝的粘假指甲胶水

    生活 2021年10月26日
  • Java程序最容易犯的错误有哪些呢

    技术Java程序最容易犯的错误有哪些呢今天就跟大家聊聊有关Java程序最容易犯的错误有哪些呢,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  1.Duplicat

    攻略 2021年11月16日
  • 鲁滨逊是什么样的人,鲁滨逊是一个怎样的人?举例说明

    技术鲁滨逊是什么样的人,鲁滨逊是一个怎样的人?举例说明鲁滨逊漂流记》 鲁滨逊这个人物是世界文学中第一个资产阶级正面典型.他出生于一个有着幸福生活的中产阶层生活的家庭,原本他可以安乐地过完一生,可是从小便想遨游四海的念头促

    生活 2021年10月25日
  • 高级语言程序设计实验4-2

    技术高级语言程序设计实验4-2 高级语言程序设计实验4-2题目描述有 12 人围坐成一圈玩报数游戏,从1号人员开始顺时针报数,报到k的人员被淘汰出局;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从

    礼包 2021年11月27日