Go语言之并发编程练习

news2024/10/7 6:45:45

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)
}

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

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

相关文章

ENSP实验三:搭建VPN(GRE,未配置安全策略)

目录 1、基础配置&#xff1a;IP地址&#xff0b;防火墙安全区域&#xff1b; 2、使ISP&#xff08;运营商&#xff09;网络的路由可达-OSPF&#xff1b; 3、建立VPN隧道&#xff08;两个防火墙之间&#xff09;&#xff1b; 4、引流 1、基础配置&#xff1a;IP地址&#xf…

c语言小项目——通讯录中阶(动态内存版)

通讯录初阶&#xff1a;点这里 通讯录高阶&#xff1a;点这里 动态内存版改进之处结构体初始化通讯录添加联系人销毁通讯录 完整代码contact.hcontact.ctest.c 动态内存版改进之处 结构体 contact.c 初始化通讯录 contact.h contact.c 添加联系人 contact.c 销毁通讯录 te…

Linux挂载iso镜像文件为yum源

场景 工作中&#xff0c;经常需要在公司的内网环境节点安装一些第三方的服务&#xff08;例如HaProxy&#xff09;&#xff0c;一般他们都依赖一些基础工具&#xff0c;或者基础库&#xff0c;例如 openssl 、openssl-devel、gcc 等等。如果能联网&#xff0c;直接通过 yum 命…

干洗店预约下单小程序,洗衣店洗鞋店收银软件会员取衣管理

干洗店预约下单小程序&#xff0c;洗衣店洗鞋店收银软件会员取衣管理 干洗店洗鞋店同城预约上门洗衣系统小程序洗护软件APP码上洗鞋 主要功能&#xff1a; 1、专业的收衣收鞋功能。接收客户的预洗衣物&#xff0c;根据要求和提示输入衣物详细信息&#xff0c;包括衣服的颜色&a…

selenium-多窗口和frame处理

1.切换窗口 适用场景&#xff1a;点击按钮后&#xff0c;重新打开一个窗口&#xff0c;想要在新的窗口定位操作&#xff0c;就需要切换窗口 原理&#xff1a;获取窗口的唯一标识就是句柄&#xff0c;获取到句柄&#xff0c;就可以切换到对应的窗口了 处理方法&#xff1a; …

M7二极管-ASEMI迷你贴片整流二极管M7二极管

编辑&#xff1a;ll M7二极管-ASEMI迷你贴片整流二极管M7二极管 型号&#xff1a;M7二极管 品牌&#xff1a;ASEMI 芯片个数&#xff1a;1 芯片尺寸&#xff1a;46MIL 封装&#xff1a;SMAF 恢复时间&#xff1a;ns 工作温度&#xff1a;-50C~150C 浪涌电流&#xff1…

python实现拼多多商品详情接口API

最近工作需要用到拼多多的一些接口&#xff0c;官方竟然没有提供&#xff0c;python的sdk&#xff0c;于是就自己简单的写了一个商品SKU接口的api。 1、代码 #!/usr/bin/python3# -*- coding: utf-8 -*-# Time : 2020/3/29 0021 下午 19:40# Author : xiaozhi&#xff01;…

docker基础1——架构组成、安装配置

文章目录 一、发展起源1.1 传统虚拟化与容器虚拟化1.2 docker底层核心技术1.2.1 命名空间1.2.2 控制组 1.3 docker工作方式1.4 docker容器编排1.5 docker优劣势1.6 docker架构组成 二、yum安装docker三、配置docker加速器 一、发展起源 背景了解&#xff1a; 容器是内核里的一项…

重磅升级 | 睿士主机威胁溯源系统全新升级,助力用户2023网络攻防演练

攻防演练至今已走过7个年头&#xff0c;逐渐成为网络安全防御体系中至关重要的一环。随着攻防演练对抗水平不断升级&#xff0c;攻击手段愈发隐蔽&#xff0c;攻击自动化程度逐步提高&#xff0c;技术储备也越来越有针对性&#xff0c;从广撒网到精准打击&#xff0c;这些都给蓝…

解决find: ‘/run/user/1000/gvfs’: 权限不够

问题描述 在用find查找对应的文件时&#xff0c;突然报错这个问题 解决办法 其实这个目录是空的&#xff0c;所以删除就好了执行下列操作&#xff1a; umount /run/user/1000/gvfs rm -rf /run/user/1000/gvfs 之后的查找中就没有了报错提示。

Spring AOP的介绍与实现

文章目录 Spring AOP1. Spring AOP概念2. Spring AOP的作用3.AOP的组成4. Spring AOP的实现4.1 添加Spring AOP依赖4.2 定义切面&#xff08;创建切面类&#xff09;4.3 定义切点&#xff08;配置拦截规则&#xff09;4.3.1 切点表达式语法 4.4 定义通知的实现 5. Spring AOP实…

【Java】Mybatis使用Collection属性

前言 这篇文章实现一下不使用left join等连接关键字来实现Mybatis的联表查询功能。包括json类型数据映射到Java实体类中。 库表 父表db1_json 子表db1_json_attach&#xff0c;子表parent_id对应副本的id。 实体类 新建Db1JsonDTO数据传递对象实体。 Data public class Db…

GRE实验

题目参考&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;地址规划拓扑设计&#xff0c;配置IP地址 R1配置&#xff1a; <Huawei>system-view [Huawei]sy R1 [R1]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip address 192.168.1.1 24 [R1-GigabitEthernet0/0/1]in…

【JavaEE】JavaEE进阶:框架的学习 - Spring的初步认识

JavaEE进阶首章 文章目录 【JavaEE】JavaEE进阶&#xff1a;框架的学习 - Spring的初步认识1. JavaEE初阶 与 JavaEE进阶 开发上的区别1.1 Servlet VS Spring Boot1.2 Spring Boot的 “hello world”代码演示1.2.1 Spring Boot项目的创建1.2.2 hello world1.2.3 发布 2. 框架的…

Python补充笔记2-函数

目录 一、函数​编辑 二、函数的创建和调用​编辑 三、函数的参数传递​编辑 四、参数传递的内存分析​编辑 五、函数的返回值​编辑 六、函数的参数定义 默认值参数 七、函数的参数总结​编辑 八、变量的作用域​编辑 九、递归函数 十、斐波那契数列 十一、知识点总结​编辑 …

A7二极管-ASEMI迷你封装整流管A7二极管

编辑&#xff1a;ll A7二极管-ASEMI迷你封装整流管A7二极管 型号&#xff1a;A7二极管 品牌&#xff1a;ASEMI 封装&#xff1a;SOD-123 正向电流&#xff1a;1A 反向耐压&#xff1a;1000V 芯片大小&#xff1a;60MIL 芯片个数&#xff1a;1 引脚数量&#xff1a;2 …

将监控摄像头的监控视频放在网页或APP中无插件播放

需求 1)将监控摄像头的监控视频集成到网页中&#xff0c;实现无插件播放&#xff0c;监控摄像头可以是海康、大华、TPLink等 2)将监控视频集成到业务平台中播放&#xff0c;包括网页、微信公众号、小程序、APP等形态 3)远程调取内网里的摄像头视频&#xff0c;实现远程监控 实现…

git rebase 合并提交

一. 合并提交步骤 git log --oneline 查看当前提交记录 git rebase -i HEAD~2 选择最后提交的2条记录进行合并进入编辑界面,将c865404的pick改为f, 表示向前合并也就是向cc5a54合并 编辑完之后:wq 保存并退出git rebase --continuegit push --force origin feature/v1.2 推送…

12. 一些开发中遇到的SQL问题

文章目录 一些开发中遇到的SQL问题1. sql报11090错误,原因可能是以下错误&#xff0c;在&#xff1f;占位符后有一个空格2. 占位符&#xff1f;的位置不能是表名&#xff0c;否则会无法进行预编译3. mysql中desc是关键字&#xff0c;如果字段名称为desc会报错4. 数据库中时间格…

【已解决】天翼电信宽带改桥模式,使用路由器ppoe拨号

运营商在给办理宽带时会默认给宽带设置成光猫ppoe拨号&#xff0c;路由器只需设置为dhcp获取ip&#xff0c;插入到光猫的lan口即可上网。但运营商的光猫路由性能有限&#xff0c;会影响到网络体验。而将光猫设置为桥模式&#xff0c;使用路由器拨号&#xff0c;可以实现路由器进…