首页 > 编程语言 >GO并发编程

GO并发编程

时间:2024-03-28 12:01:29浏览次数:21  
标签:编程 goroutine sync 并发 GO Go channel goroutines

Go 语言的并发编程是其核心特性之一,它提供了简洁强大的机制来处理并发任务。Go 并发模型的基石是 goroutines 和 channels。

Goroutines

Goroutine 是 Go 语言中实现并发的基本单位。你可以把它看作一个轻量级的线程,由 Go 运行时(runtime)进行管理。启动一个新的 goroutine 非常简单,只需要在函数调用前加上关键字 go

go func() {
    fmt.Println("Hello from a goroutine!")
}()

与操作系统线程相比,goroutines 有几个关键优势:

  • 更小的栈:默认情况下,goroutine 会以较小的栈空间开始(通常是2KB),而栈大小会根据需要动态地增长和缩减。
  • 低开销:创建和销毁 goroutines 的开销很小,使得同时运行成千上万个 goroutines 成为可能。
  • 简单的切换:Go 运行时包含自己的调度器,可以在用户级别上做到高效的 goroutine 切换,不依赖于内核的线程调度。

Channels

Channels 是 goroutines 之间进行通信的主要方式。它们是类型安全的管道,可以用来传递消息或者同步多个 goroutine 的执行。

创建一个 channel 很简单:

ch := make(chan int)

你可以向 channel 发送数据:

ch <- 42

也可以从 channel 接收数据:

value := <-ch

使用 select 语句,可以同时等待多个 channel 操作,并在某个操作就绪时执行对应的代码块:

select {
case x := <-ch1:
    fmt.Println("Received from ch1:", x)
case ch2 <- y:
    fmt.Println("Sent to ch2:", y)
default:
    fmt.Println("No communication ready")
}

sync 包

除了 goroutines 和 channels,Go 的标准库还提供了 sync 包,其中包含了一系列完成各种同步工作的原语。

  • Mutexes:互斥锁可用来保护共享资源,避免发生竞态条件。
  • WaitGroups:等待组用来等待一组 goroutines 执行完成。
  • Cond:条件变量可以让一组 goroutines 等待某个条件的满足。
  • Oncesync.Once 可以确保指定函数在程序运行期间只被执行一次。
  • Pool:对象池可以用来存储和复用临时对象,减少内存分配。

Context 包

在并发编程中,经常需要控制 goroutine 的启动、运行和停止。context 包提供了一个方便的方式来传递取消信号、超时、截止时间以及其他请求相关的值。

原子操作

sync/atomic 包提供了一套原子操作的函数,用于在多个 goroutine 间安全地执行简单的数值操作,如增加或比较和交换。

并发编程在 Go 中设计得非常简单直观,但仍需谨慎使用。正确理解 goroutines 和 channels 的行为,知晓如何处理死锁和竞态条件,以及何时该使用其他同步技术,是编写高效且稳定的并发程序的关键。

标签:编程,goroutine,sync,并发,GO,Go,channel,goroutines
From: https://blog.csdn.net/xbh9897/article/details/137040061

相关文章

  • Go Template 常用疑难知识点
    前段时间,在项目开发中经常和go语言的HTMLLtemplate打交道,特意总结了几点我在使用中经常遇到不太明确的,比较纠结疑惑的知识点,巩固一下,也方便以后查找。​ 至于关于gotemplate的系统性的介绍说明,这是一篇我经常查看的文章,写的非常全面。1、作用域访问​ gotemplate中最常打交......
  • Django框架之python后端框架介绍
    一、网络框架及MVC、MTV模型1、网络框架网络框架(Webframework)是一种软件框架,用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具,以简化开发过程并提高开发效率。网络框架通常包括以下功能和特点:路由处理(Routing):网络框架定义了URL与处理程序......
  • Python数据库编程全指南SQLite和MySQL实践
    本文分享自华为云社区《Python数据库编程全指南SQLite和MySQL实践》,作者:柠檬味拥抱。1.安装必要的库首先,我们需要安装Python的数据库驱动程序,以便与SQLite和MySQL进行交互。对于SQLite,Python自带了支持;而对于MySQL,我们需要安装额外的库,如mysql-connector-python。#安装MyS......
  • mysql 主从复制 -- django发送钉钉通知
    mysql主从搭建#之前做过redis的主从,很简单#mysql稍微复杂一些,搭建mysql主从的目的是?-读写分离-单个实例并发量低,提高并发量-只在主库写,读数据都去从库#原理MySQL服务器之间的主从同步是基于二进制日志机制(binlog),主服务器使用二进制日志来(bi......
  • 【附源码】django计算机毕业设计web的学生作业管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化、数字化的教育环境中,学生作业管理已成为教学过程中不可或缺的一部分。传统的作业管理方式,如纸质作业本、电子邮件提交等,存在着效率低下、资源......
  • 【附源码】django计算机毕业设计病房管理系统设计与实现(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在现代医疗体系中,病房管理是医院运营的重要组成部分。随着科技的不断进步和信息化水平的提高,传统的手工或半自动化的病房管理模式已经无法满足现代医疗服务......
  • gopher伪协议
    基础知识基本格式基本格式:URL:gopher://<host>:<port>/<gopher-path>web也需要加端口号80gophert协议默认端口为70gopheri请求不转发第一个字符get请求问号(?)需要转码为URL编码,也就是%3f回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a在HTTP包的最后要加%0d%......
  • Centos7.9 部署mongodb高可用集群 3节点
    一、部署准备1.三台节点准备192.168.145.172192.168.145.173192.168.145.1742.官网地址:社区版传送门3.选择对应的版本并下载4.创建用于存放数据、日志文件和配置文件的文件夹mkdir-p/data/mongodbmkdir/var/log/mongodbmkdir/etc/mongodb5.解压安装包,配置环境......
  • 区块链编程七大语言,使用最多的竟是Java
    SQL——结构化查询语言(StructuredQueryLanguage)或“Sequel”,是IBM开发的一种编程语言,用于与存储、查询和处理数据的数据库进行沟通。如今SQL约拥有700万名开发者。MySQL、PostgreSQL、SQLServer、DB2、Oracle等主流数据库都使用SQL来开发应用程序。使用SQL的区块链项......
  • 在Go语言中如何正确使用init函数
    1.概念        init函数是用于初始化应用程序状态的函数。既不接收参数也不返回结果,仅仅是一个func()类型的函数。当初始化包时,将对包中所有的常量和变量声明进行计算。然后执行init函数。下面是初始化main包的例子:packagemainimport"fmt"vara=func()int......