当前位置: 首页 > news >正文

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接收数据时,如果缓冲中有数据,则接收就不会阻塞,否则接收者会阻塞直到缓冲区有发送者发送数据。

相关文章:

Golang笔记_day10

Go面试题(三) 1、什么是channel,为什么它可以做到线程安全 在Go语言中,channel是一种类型,它可以用来在协程之间传递数据通过共享内存来通信: 通过共享内存来通信是指多个线程或进程直接访问相同的内存区域…...

mlir learn

https://github.com/j2kun/mlir-tutorial 学习这个项目 https://www.jeremykun.com/2023/08/10/mlir-getting-started/ get start 用我的mac编译一下试试看 然后遇到架构不对的问题 因为他的提交默认是x86 https://github.com/j2kun/mlir-tutorial/pull/1/commits/5a267e269d57…...

Windows安装RabbitMQ 4.0.2(图文教程)

本章教程,主要记录在Windows 10上RabbitMQ 4.0.2的安装过程。 一、下载安装包 1、官方下载(速度不稳定) Erlang:https://github.com/erlang/otp/releases/download/OTP-26.0/otp_win64_26.0.exe RabbitMQ 4.0.2:https://github.com/rabbitmq/rabbitmq-server/releases/do…...

分布式系统中为什么需要使用消息队列

本文转载自 linkedkeeper.com 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ&#…...

Linux环境配置(学生适用)

1.挑选最便宜的云服务器 如腾讯云服务器,华为云服务器,百度云服务器等等…… 2.找到你的云服务器实例,然后找到你的公网IP。 3.云服务器实例 ---更多 --- 重置root密码 (一定要重置) 4. 下载并安装 xshell 或者其他登陆软件 xshel…...

麦禾软件:Mac用户找免费开源工具的最佳选择

抖知书老师推荐: ​麦禾软件已经成为众多Mac用户的必备平台,尤其对于那些经常寻找免费、开源、正版软件的用户来说,绝对是一个福音。随着科技的不断进步和用户需求的提升,安全、便捷的软件下载体验成为用户选择平台的核心标准。而…...

OpenCV4.8 开发实战系列专栏之 08 - 通道分离与合并

大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。 专栏代码全部基于C 与Python双语演示,专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点: OpenCV中默认imread函数加载图像文件&#…...

iOS 18.1 RC 版本发布,修复iPhone16随机重启、浏览视频卡顿等bug

今日,苹果发布 iOS 18.1 RC 版本升级,内部版本号为 22B82。 iOS 18.1 RC 也就是 iOS 18.1 准正式版,如果没有大的 Bug,这将是 iOS 18.1 正式版发布前最后一次更新,正式版预计下周向消费者推送。 该 RC 版除了为海外用…...

安装buildkit,并使用buildkit构建containerd镜像

背景 因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit 简介 服务端为buildkitd,负责和runc或containerd后端连接干活,目前…...

maven jar包二进制文件 invalid stream header: EFBFBDEF 的错误

背景: 将jasper模板文件导入jar包后,生成文件报错 org.springframework.core.io.Resource resource new ClassPathResource("/template/XXXX.jasper");jasperPrint JasperFillManager.fillReport(resource.getInputStream(), paramentMap, …...

Git绑定Gitee或Github以及Git面试常见题

1.绑定Git或Gitee Git绑定Gitee或GitHub的过程相对简单,以下是详细的步骤说明: 一、绑定Gitee仓库 在Gitee上创建仓库 登录Gitee官网,点击首页右上角的“”号,选择“新建仓库”。在新建仓库页面,输入仓库的名称、描述…...

值得细读的8个视觉大模型生成式预训练方法

写在前面 大语言模型的进展催生出了ChatGPT这样的应用,让大家对“第四次工业革命”和“AGI”的来临有了一些期待,也作为部分原因共同造就了美股2023年的繁荣。LLM和视觉的结合也越来越多:比如把LLM作为一种通用的接口,把视觉特征…...

go 包相关知识

在Go语言中,包的引用和搜索路径是由环境变量GOPATH和GO111MODULE共同决定的。 GOPATH环境变量:这个变量定义了默认的工作目录,Go命令行工具将会在这个目录下查找包文件。这个目录通常包含三个子目录:src、bin和pkg。 src目录包含…...

机器学习:opencv--人脸检测以及微笑检测

目录 前言 一、人脸检测的原理 1.特征提取 2.分类器 二、代码实现 1.图片预处理 2.加载分类器 3.进行人脸识别 4.标注人脸及显示 三、微笑检测 前言 人脸检测是计算机视觉中的一个重要任务,旨在自动识别图像或视频中的人脸。它可以用于多种应用&#xff0…...

linux系统挂载硬盘

参考链接:https://www.cnblogs.com/wenhainan/p/12292823.html (1)lsblk命令查看磁盘挂载情况 (2)使用fdisk分区新磁盘 如果要分多个分区需指定每个分区的大小 (3)格式化新分区 mkfs命令格…...

MySQL实现主从同步

一、首先我们准备3台mysql 分别为: 主服务器:test-mysql-master,端口3306 从服务器:test-mysql-slave1,端口3307 从服务器:test-mysql-slave2,端口3308 注意:如果防火墙是开着的记得把关掉,并且重启docker…...

人工智能--数学基础

目录 ​编辑2.1 线性代数基础 2.2 微积分及优化理论 2.3 概率论与统计学 2.4 信息论简介 2.1 线性代数基础 线性代数是处理向量空间(包括有限维或无限维)以及这些空间上的线性映射的一门数学分支。在线性代数中,最核心的概念包括向量、矩…...

2024人工智能技术的普及 如何看待AI技术的应用前景

AI 技术的应用前景十分广阔,但也面临着一些挑战,以下是对其应用前景的一些看法: 积极方面: 多行业深度融合与效率提升5: 医疗领域:AI 在医疗影像分析、辅助诊断、疾病预测等方面具有巨大潜力。例如&#xf…...

日常记录:springboot 2.2.5 + es 6.8.12

前言 最近有用到搜索引擎的功能,这不得把之前的es过程实践一遍,但发现过程坎坷,因为版本太低了。 一、安装es 6.8.12 安装过程跟之前写那章日常记录:elasticsearch 在linux安装_elasticsearch linux安装-CSDN博客一样&#xff0…...

MySQL数据库备份与恢复详解

文章目录 一、为什么需要备份数据库?二、MySQL数据库的备份方式1. 逻辑备份2. 物理备份3. 二进制日志备份 三、恢复数据库1. 使用mysqldump备份文件恢复2. 使用物理备份恢复3. 使用二进制日志恢复 四、备份与恢复的最佳实践五、结语 在日常的数据库运维中&#xff0…...

Altium Designer 系统偏好设置全解析:从新手到高手的效率跃迁

1. Altium Designer系统偏好设置的重要性 刚接触Altium Designer时,我和大多数新手一样,只关注画原理图、布局布线这些核心功能。直到有次看到同事操作,同样的操作他只用我三分之一的时间完成,我才意识到系统偏好设置的重要性。这…...

物理神经计算:突破冯·诺依曼瓶颈的新范式

1. 物理神经计算:突破冯诺依曼瓶颈的新范式在传统计算架构面临能效瓶颈的今天,物理神经计算(Physical Neural Computing)正在掀起一场硬件革命。这种新型计算范式不再依赖传统的数字逻辑门和冯诺依曼架构,而是直接利用…...

mikupad:单文件AI写作前端,兼容多后端与深度创作控制

1. 项目概述:一个单文件全能的AI写作前端如果你和我一样,经常折腾各种本地大语言模型,那你一定对“前端界面”这件事深有体会。Oobabooga的WebUI功能强大但略显臃肿,KoboldCPP的界面简洁但可定制性有限,而各种API调用又…...

开源技能管理工具rei-skills:从零构建个人技术能力图谱

1. 项目概述与核心价值 最近在折腾个人知识库和技能树管理,发现了一个挺有意思的开源项目 rootcastleco/rei-skills 。这项目名字乍一看有点神秘, rei 在日语里是“零”或“灵”的意思,结合 skills ,我理解它想表达的是一种…...

STM32H7硬件JPEG编码实战:从RGB565到JPEG文件,一个完整项目的避坑记录

STM32H7硬件JPEG编码实战:从RGB565到JPEG文件的完整避坑指南 在嵌入式图像处理领域,实时压缩摄像头采集的原始图像数据一直是个挑战。STM32H7系列凭借其内置的硬件JPEG编解码器(HJPEG),为开发者提供了高效的解决方案。…...

告别离线语音包:用Google Cloud Text-to-Speech API为你的App注入更自然的人声(附Android集成代码)

云端语音合成技术实战:为移动应用注入自然语音的完整方案 在移动应用开发中,语音合成(TTS)技术正成为提升用户体验的关键要素。传统离线语音引擎往往面临发音生硬、语调单一和语种支持有限的问题,而现代云端语音合成API则提供了接近真人、富有…...

Cursor Pro破解工具完整指南:如何绕过限制实现永久免费使用

Cursor Pro破解工具完整指南:如何绕过限制实现永久免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached you…...

仅限内部测试者知晓:Midjourney未公开的--detail boost隐式指令(实测使睫毛/织物/金属反光细节识别率提升3.2倍)

更多请点击: https://intelliparadigm.com 第一章:Midjourney图像放大与细节增强 Midjourney v6 及后续版本原生支持高分辨率图像生成与智能细节增强,其核心能力不仅依赖于模型权重,更通过 --zoom 2、--style raw 和 --s 750 等参…...

Allegro丝印层加汉字和防静电标识?我找到了比自带功能更香的免费Skill工具

Allegro丝印层高效处理方案:汉字与防静电标识的终极实践指南 在PCB设计的最后阶段,丝印层的处理往往成为工程师们头疼的问题。尤其是当设计需要添加中文注释、企业标识或行业标准符号(如防静电警告标志)时,Allegro原生…...

从泡泡实验室到阿木社区:PX4开发者如何在国内技术圈子里快速成长?

从泡泡实验室到阿木社区:PX4开发者如何在国内技术圈子里快速成长? 在无人机开源飞控领域,PX4和Pixhawk已经成为开发者绕不开的技术栈。但相比国外活跃的开发者社区,国内的技术生态往往让新手感到无从下手——百度贴吧的讨论碎片化…...