Go语言之并发编程练习,GO协程初识,互斥锁,管道:channel的读写操作,生产者消费者

news2024/12/23 22:14:42

GO协程初识

package main

import (
	"fmt"
	"sync"
	"time"
)

func read() {
	defer wg.Done()
	fmt.Println("read start")
	time.Sleep(time.Second * 3)
	fmt.Println("read end")
}

func listenMusci() {
	defer wg.Done()
	fmt.Println("listenMusci start")
	time.Sleep(time.Second * 5)
	fmt.Println("listenMusci end")
}

var wg sync.WaitGroup //声明一把锁,同步的一个等待锁,本质是一个计时器,所有的进程都可以共享

func main() {
	start := time.Now().Unix()

	wg.Add(2)
	go read()        //开启GO并发
	go listenMusci() //开启GO并发

	wg.Wait() //计数器为0继续执行

	//time.Sleep(time.Second * 10) //将main主线程阻塞下

	end := time.Now().Unix()
	fmt.Println(end - start)
}

输出结果:
在这里插入图片描述

互斥锁

package main

import (
	"fmt"
	"sync"
	"time"
)

/*
	互斥锁!!!
互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有
一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。

使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,
其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,
多个goroutine同时等待一个锁时,唤醒的策略是随机的。
*/
var wg sync.WaitGroup //声明一把锁,同步的一个等待锁,本质是一个计时器,所有的进程都可以共享
var lock sync.Mutex

var x = 0

func add() {
	defer wg.Done()

	//加锁,互斥锁
	lock.Lock()
	x++
	lock.Unlock()

	println(x)
	time.Sleep(time.Second * 10) //
}
func main() {
	wg.Add(100)
	for i := 0; i < 100; i++ {
		go add()
	}
	wg.Wait() //计数器为0继续执行

	fmt.Println(x)
}

管道:channel的读写操作

package main

import (
	"fmt"
	"reflect"
)

/*
	管道:channel的读写操作!!!
	chan是go的协程之间通信的数据类型(引用类型)
	没有索引的概念,取完第一个才能取第二个
*/
func 声明一个管道() {
	//声明一个管道
	var ch = make(chan int, 3)
	//插入值
	ch <- 12
	ch <- 13
	ch <- 15
	//取值
	fmt.Println(<-ch)
	fmt.Println(<-ch)
	fmt.Println(<-ch)
}

//声明一个结构体
type Msg struct {
	content string
	from    string
}

func main() {
	var ch = make(chan interface{}, 6)
	ch <- "hello"
	ch <- true
	ch <- 15
	ch <- Msg{content: "from kegog", from: "中国北京"}
	one := <-ch
	fmt.Println(one, reflect.TypeOf(one))

	fmt.Println(<-ch)

	fmt.Println(<-ch)

	//fmt.Println(<-ch)
	fmt.Println((<-ch).(Msg).content)
}

管道关闭后不能再写入值了

package main

import "fmt"

/*
	管道的关闭与循环!!
*/
func 管道关闭后不能再写入值了() {
	ch3 := make(chan int, 10)
	ch3 <- 1
	ch3 <- 2
	ch3 <- 3

	close(ch3)
	fmt.Println(<-ch3)
	ch3 <- 4
}
func main() {
	管道关闭后不能再写入值了()
}

遍历管道之前要先关闭管道close

package main

import (
    "fmt"
    "time"
)

func main() {

    ch := make(chan int, 10)
    ch <- 1
    ch <- 2
    ch <- 3

    // 方式1
    go func() {
        time.Sleep(time.Second * 10)
        ch <- 4

    }()

    for v := range ch {

        fmt.Println(v, len(ch))
        // 读取完所有值后,ch的sendq中没有groutine
        if len(ch) == 0 { // 如果现有数据量为0,跳出循环
            break
        }
    }

    close(ch)
    for i := range ch {
        fmt.Println(i)
    }

}

生产者消费者

package main

import (
	"fmt"
	"sync"
	"time"
)

func producer(ch chan<- int) {
	defer wg.Done()
	for i := 1; i < 11; i++ {
		time.Sleep(time.Second)
		ch <- i
		fmt.Println("生产了:", i)
	}
	close(ch)
}

func consumer(ch <-chan int) {
	defer wg.Done()
	for i := range ch {
		fmt.Println("消费了:", i)
	}
}

var wg sync.WaitGroup

func main() {
	ch := make(chan int, 100)

	wg.Add(2)
	go producer(ch)
	go consumer(ch)

	wg.Wait()
	fmt.Println("process end")
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【lesson2】Linux基本指令1

文章目录 touch创建文件更新文件最新修改时间 lslsls -lls -als -i pwd...cdcd 路径法一&#xff1a;cd 绝对路径法二&#xff1a;cd 相对路径 cd - stattreemkdirmkdir创建一个目录mkdir -p创建一串路径目录 ~/rmdirrmrmrm -frm -rrm -i mancpcpcp -r mvnaocatcatcat -n ta…

错过后悔!!!Java岗秋招最全面试攻略!!

这里给大家整理了完整的Java完整的架构面试核心知识体系。按照这样的一个脉络&#xff0c;只要大家能够掌握这里面的绝大部分内容&#xff0c;并且有过相应的一些实践&#xff0c;那么就可以去面试自己心仪的工作了。 这份笔记总结都是作者近几年结合众多牛客的面经分享&#…

【完整版】zabbix企业级监控(概念、简单操作、页面优化、监控主机自己、监控linux、监控Win10)

第三阶段基础 时 间&#xff1a;2023年7月19日 参加人&#xff1a;全班人员 内 容&#xff1a; zabbix企业级监控 目录 一、Zabbix概述 &#xff08;一&#xff09;Zabbix简介 &#xff08;二&#xff09;Zabbix运行条件&#xff1a; &#xff08;三&#xff09;Zab…

【面试笔试避坑指南】一

从这篇文章开始 进行笔试的训练环节&#xff0c;我会在 本专栏详细介绍笔试的易错点&#xff0c;帮助大家精准避坑。 1.有如下一段代码&#xff08;unit16_t为2字节无符号整数&#xff0c;unit8_t位1字节无符号整数&#xff09;&#xff1b; 请问x.z.n在大字节序和小字节序机器…

MySQL第五章、索引事务

目录 一、索引 1.1 概念 1.2 作用 1.3 使用场景 1.4 使用 1.5 案例 二、索引背后的数据结构 2.1 B-树&#xff08;B树&#xff09; 2.2 B树&#xff08;MySQL背后数据结构&#xff09; 三、事务 3.1 为什么使用事务 3.2 事务的概念 3.3 使用 3.4并发执行事务产生…

《Java黑皮书基础篇第10版》 第12章【习题】

Java语言程序设计 习题第十二章 12.2章节习题 12.1 使用异常处理的优势是什么? 如果没有异常处理&#xff0c;方法执行(called method)出错时&#xff0c;调用者(caller)没有办法进行处理&#xff08;比如方法所在的类被封装&#xff0c;调用者无法访问&#xff09;&#xf…

ubuntu版本Linux操作系统上安装键盘中文输入法

要在ubuntu版本Linux操作系统上安装键盘中文输入法 可以按照以下步骤进行操作&#xff1a; 1、Linux终端输入&#xff1a;sudo apt-get install ibus-pinyin 这将安装一个常用的中文输入法 “ibus-pinyin”。 2、重新启动系统&#xff1a;为了使输入法生效&#xff0c;需要…

喜报!沃通CA中标河南城建学院SSL证书服务项目

沃通CA再添中标喜报&#xff01;沃通CA中标河南城建学院SSL证书服务项目&#xff0c;为河南城建学院官网及各类信息系统提供HTTPS加密及网站可信身份认证&#xff0c;保护数据传输安全、保障通信主体身份可信。 为加快教育现代化、推进新时代教育信息化发展&#xff0c;我国发布…

springboot 内嵌H2

pom 文件配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version><relativePath/></parent><dependencies><dependency>&…

List迭代器是如何实现的

我们知道当我们使用vector的迭代器时,它的操作可以让它指向下一个位置,解引用操作就可以找到这个位置的值,因为vector底层时用的一个顺序表,可以支持随机访问。对比list来说vector底层的迭代器是十分的简便可观的。虽然我们使用list的迭代器外观上和vector是大同小异的&#xf…

备战秋招 | 笔试强训9

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、某函数申明如下&#xff08;&#xff09; void Func(int &nVal1); A. Func(a) B. Func(&a) C. Func(*a) D. Func(&(*a)) 2、C语言中&#xff0c;类ClassA的构造函数和析构函数的执行…

API漏洞检测研究

xray API漏洞检测_青霄的博客-CSDN博客 Swagger ui接口自动化批量漏洞测试_swgeer-ui 漏洞_山山而川的博客-CSDN博客 什么是 API 安全测试以及它是如何工作的&#xff1f; | Synopsys API 安全测试针对应用程序编程接口 (API) &#xff0c;就其安全性、正确性和可靠性进行测试&…

PHP之 使用阿里云对象存储OSS上传图片

参考地址 https://blog.csdn.net/weixin_42672802/article/details/129136850 https://blog.csdn.net/HZX19941018/article/details/86066529 function uploadosss($images){// 阿里云账号AccessKey拥有所有API的访问权限&#xff0c;风险很高。强烈建议您创建并使用RAM用户进…

自动化测试转型挑战及其解决方案

目录 前言&#xff1a; 自动化测试挑战 选择合适的自动化测试方法 选择正确的自动化工具 整理数据 何时开始和停止 如何克服挑战 前言&#xff1a; 自动化测试的转型是许多组织在提高测试效率和质量方面的重要举措。然而&#xff0c;这个转型过程中可能会面临一些挑战。…

python_day11_pymysql

SQL基础语法回忆 show DATABASES;use world;-- SELECT DATABASES();show TABLES;CREATE TABLE Student(id int,name VARCHAR(10),age int,gender VARCHAR(5&#xff09; );删除表 # 删除表 DROP TABLE Student;插入操作 insert into student(id) VALUES(1),(2),(3);insert i…

通达信比较好用的CCI指标公式_通达信公式

M:14;N:6;Q:20; MM:IF(PERIOD0,M,IF(PERIOD1,M,IF(PERIOD2,M,IF(PERIOD3,M,IF(PERIOD4, M,IF(PERIOD5,Q,IF(PERIOD6,Q,IF(PERIOD7,Q,0)))))))); AVG:(HIGHLOWCLOSE)/3; CCI:(AVG-MA(AVG,MM))/(0.015*AVEDEV(AVG,MM)); DIF:CCI-REF(CCI,1),LINETHICK0; 前差值:ABS(REF(CCI,1…

vue3后台管理系统封装的弹窗组件

弹窗组件效果 ComModelR.vue组件 <template><div><a-modal v-model:visible"visible" :title"title" ok"handleOk" :bodyStyle"bodyStyle" :width"width" :maskClosable"false":destroyOnClose&q…

性能测试监控指标及分析调优

目录 前言&#xff1a; 一、哪些因素会成为系统的瓶颈&#xff1f; 二、哪些指标做为衡量系统的性能 1、RT 响应时间&#xff0c;包括如下 2、TPS 吞吐量 3、资源使用率 三、性能测试注意的问题 四、定位性能问题的时候&#xff0c;可以使用自下而上的策略分析排查 五…

铁电材料极化高压放大器ATA-7025技术指标及使用说明

铁电材料是一类具有特殊电学性质的材料&#xff0c;在现代电子技术和器件中具有广泛的应用。铁电材料的极化是其重要的特征之一&#xff0c;极化测试是评估铁电材料性能的关键方法之一。一般铁电极化测试&#xff0c;是通过根据外电场施加的电压变化来观察材料产生的极化效应。…

unity01 界面布局

布局 坐标系 遵循左手定则&#xff0c;中指是y轴、食指是x轴、大拇指是z轴。 可以理解为x轴代表东西方向&#xff0c;z轴代表南北方向&#xff0c;y轴代表上下方向。 常用快捷键 鼠标中键&#xff1a;移动地图 右键&#xff1a;移动视角 shift鼠标左键单击gimo导航器的小方…