Golang笔记_day10

Go面试题(三)

1、什么是channel,为什么它可以做到线程安全

     在Go语言中,channel是一种类型,它可以用来在协程之间传递数据
通过共享内存来通信:

        通过共享内存来通信是指多个线程或进程直接访问相同的内存区域,它们通过读写这个共享内存区域来进行数据传递和通信。在这种模式下,各个线程或进程之间可以直接修改共享内存中的数据,实现数据的共享和传递。然而,这种方式需要开发者自行处理数据同步和互斥访问的问题,以避免数据竞争和一致性问题。
通过通信来共享内存:

        通过通信来共享内存是指使用消息传递等通信方式,在不同的线程或进程之间进行数据交换和共享。在这种模式下,各个线程或进程之间并不直接访问共享内存,而是通过发送消息、使用通道等方式来进行数据交换。这种方式可以避免直接操作共享内存带来的数据竞争和一致性问题,通过通信进行数据共享更加安全可靠,也更容易实现并发编程中的数据同步和通信需求。
为什么channel是线程安全的
      Golang的Channel,发送一个数据到Channel 和 从Channel接收一个数据都是原子性的。核心思想就是:通过通信来共享内存。

内置同步机制:

        Channel 在底层实现时使用了锁和其他同步机制来保证并发读写的安全性。
        在向通道发送或接收数据时,会自动进行加锁和解锁操作,确保每次操作的原子性和线程安全性。
阻塞特性:

        当通道满了(发送者发送数据时),发送操作会阻塞直到有其他 goroutine 从通道中接收数据。
当通道为空(接收者尝试接收数据时),接收操作会阻塞直到有其他 goroutine 向通道中发送数据。
        这种阻塞特性可以有效避免并发读写冲突,保证了数据操作的线程安全性。
单个 goroutine 拥有所有权:

        Go 语言的设计理念是通过通信来共享内存,而不是通过共享内存来通信。
每个通道只能被一个 goroutine 拥有,并且在同一时间只能由一个 goroutine 发送或接收数据,这种所有权机制确保了通道的线程安全性。

2、怎么限制Goroutine的数量

        goroutine数量太多了,往往会带来很多麻烦,比如耗尽系统资源导致程序崩溃,或者CPU使用率过高导致系统忙不过来

控制goroutine的方法

        Context

        channel

控制goroutine的数量

        协程池

        信号量Semaphore

    channel+waitgroup实现

3、Channel是同步的还是异步的

        Go语言中的channel可以是异步也可以是同步,这取决与它是否是一个缓冲的channel

同步channel
        无缓冲的channel默认是同步的channel类型,即创建时没有执行缓冲大小。当数据被发送到无缓冲的channel中时,发送者会阻塞直到接受者收到数据。同样,当从无缓冲的channel中接收数据的时候,接受者会阻塞直到发送者发送数据。这种机制允许两个goroutine进行同步的通信。

异步的channel
        有缓冲的channel是异步的,它拥有一个缓冲队列,创建channel的时候指定队列的大小。发送者向有缓冲的channel发送数据的时候,如果缓冲区未满,则发送就不会阻塞,否则发送者同样会阻塞直到有接受者接收到数据。同样,接收者从有缓冲区的channel接收数据时,如果缓冲中有数据,则接收就不会阻塞,否则接收者会阻塞直到缓冲区有发送者发送数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/454039.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elk部署安装

elk部署 前提准备1、elasticsearch2、kibana3、logstash 前提准备 1、提前装好docker docker-compose相关命令 2、替换docker仓库地址国内镜像源 cd /etc/docker vi daemon.json # 替换内容 {"registry-mirrors": [ "https://docker.1panel.dev", "ht…

L1练习-鸢尾花数据集处理(分类/聚类)

背景 前文(《AI 自学 Lesson1 - Sklearn(开源Python机器学习包)》)以鸢尾花数据集的处理为例,本文将完善其代码,在使用 sklearn 的部分工具包基础上,增加部分数据预处理、数据分析和数据可视化…

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能

作为今年最受期待的音乐制作 DAW 更新之一,FL Studio 2024发布引入了新功能,同时采用了新的命名方式,从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Clou…

Java 解决阿里云OSS服务器私有权限图片通过URL无法预览的问题

简单描述一下此场景的业务: 由于系统中需要将上传的图片在系统中展示(private私有权限不能直接通过url直接展示),不想通过先下载下来然后以流的形式返回给前台展示这种方法很不友好,毕竟现在前台展示方式都是通过图片URL进行展示,所以就上官网查看API文档,果然找到了解决…

视频美颜平台是如何搭建的?基于直播美颜SDK源码的开发技术详解

今天,笔者将详细讲解如何基于直播美颜SDK源码搭建视频美颜平台的技术路径。 一、理解视频美颜技术 视频美颜技术主要通过图像处理算法对视频流进行实时处理,包括肤色优化、瑕疵修复、面部特征增强等。实现这一目标需要高效的图像处理算法和稳定的实时渲…

电脑异常情况总结

文章目录 笔记本无症状息屏黑屏 笔记本无症状息屏黑屏 🍎 问题描述: 息屏导致黑屏;依次操作计算机--》右键--》管理--》事件查看器--》Windows日志--》系统;从息屏到异常黑屏之间出现了很多错误,如下:事件…

大规模创新类竞赛评审方案的建模与研究

随着科技的发展和教育制度的改革,近年来涌现出一批以“创新”为主题的竞赛项目。这类竞赛的运行模式为,参赛队伍提交文档、视频或幻灯片等文本形式的作品,专家对参赛队伍提交的作品评阅判分,一份作品将由多位专家独立进行评阅打分…

WPF入门_04绑定

WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能。WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信息来设置目标对象的属性。 目标属性总是依赖属性。然而,源对象可以是任何内容,可以…

mysql8以上版本第一次下载后的登录问题

mysql8以上版本第一次下载后的登录问题 在官网下载mysql后,按照MySQL下载和安装教程操作就可以 如果出现问题,参考https://blog.csdn.net/weixin_63107823/article/details/136588474 注意ini配置文件,如果你是复制的别人的代码&#xff0…

一些简单的编程题(Java与C语言)

引言: 这篇文章呢,小编将会举一些简单的编程题用来帮助大家理解一下Java代码,并且与C语言做个对比,不过这篇文章所出现的题目小编不会向随缘解题系列里面那样详细的讲解每一到题,本篇文章的主要目的是帮助小编和读者们…

算法魅力-双指针的实战

目录 1.双指针的介绍 1. 左右指针(对撞指针) 2. 快慢指针 2.题目练习讲解 2.1 移动零 算法思路 代码展示 画图效果效果 2.2 复写零 算法思路 代码展示 2.3 快乐数 算法思路 代码展示 2.4 盛最多水的容器 算法思路 代码展示 结束语 1.双指针的…

LeetCode第101题. 对称二叉树

文章目录 😊1.题目😉2.解法 😊1.题目 尝试一下该题 😉2.解法 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSameTree…

考研读研生存指南,注意事项

本视频课程,涉及考研读研的方方面面,从考研初试→复试面试→研究生生活→导师相处→论文专利写作混毕业,应有尽有。有了他,你的研究生生涯稳了。 读研考研注意事项,研究生生存指南。_哔哩哔哩_bilibili 一、考研初试注…

数据泄露危机:提升文件安全意识的紧迫性

在当今数字化时代,数据已成为企业最宝贵的资产之一。然而,随着技术的进步,数据泄露事件的频率和规模也在不断攀升。这不仅给企业带来巨大的经济损失,还可能导致声誉受损、客户流失等一系列严重后果。因此,提升文件安全意识,加强数据保护措施,已成为企业管理中不可忽视的重要议题…

【人工智能】Transformers之Pipeline(二十):令牌分类(token-classification)

目录 一、引言 二、令牌分类(token-classification) 2.1 概述 2.2 Facebook AI/XLM-RoBERTa 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.3.3 pipeline返回参数 ​​​​​​​​​​​​​​ 2.4 pipeline…

Spring Boot 3.3 【八】整合实现高可用 Redis 集群

一、引言 在当今快速发展的软件开发领域,系统的性能和可靠性至关重要。Springboot 3 整合 Redis 7 集群具有多方面的重大意义。 首先,随着业务的不断发展,数据量呈爆炸式增长,单个 Redis 服务器往往难以满足存储和处理需求。Red…

docker-harbor

目录 一、registry 二、harbor 1.部署 harbor 1.1部署Docker-Compose 1.2部署 Harbor 服务 1.3在其他客户端上传镜像 三、维护管理Harbor 1. 创建 Harbor 用户 2.添加项目成员 3. 在客户端上使用普通账户操作镜像 4. 查看日志 5. 修改 Harbor.cfg 配置文件 6. 移除…

给定数组找出出现次数超过数组长度一半的数

🎁👉点击进入文心快码 Baidu Comate 官网,体验智能编码之旅,还有超多福利!🎁 【大厂面试真题】系列,带你攻克大厂面试真题,秒变offer收割机! ❓今日问题:给定…

低代码开发工具与传统开发工具的性能对比

随着信息技术的不断发展,软件开发工具也在不断演进。低代码开发工具近年来逐渐兴起,与传统开发工具相比,它们在性能方面有着不同的特点。 低代码开发工具的特点 易用性高:低代码开发工具通常提供可视化的开发界面,用户…

【Python数据库操作】使用SQLite和MySQL进行数据存储和查询!

【Python数据库操作】使用SQLite和MySQL进行数据存储和查询! 在现代应用程序中,数据存储与管理是至关重要的。Python为开发者提供了多种与数据库进行交互的方式,其中SQLite和MySQL是最常用的两种数据库。本文将深入探讨如何使用Python进行SQ…