GO并发编程综合应用

一.GO并发编程综合应用

1.生产者消费者模式
1.1需求分析

​ 生产者每秒生产一个商品,并通过物流公司取货

​ 物流公司将商品运输到商铺

​ 消费者阻塞等待商铺到货,需要消费10次商品

1.2实现原理

在这里插入图片描述

1.3代码实现:
package main

import (
   "fmt"
   "strconv"
   "time"
)

func main() {
   storageChan := make(chan Product, 10)
   shopChan := make(chan Product, 10)
   exitChan := make(chan bool, 1)
   for i := 1; i < 9; i++ {
      go Producer(storageChan, 10)
   }

   go Logistics(storageChan, shopChan)
   go Consumer(shopChan, 10, exitChan)
   if <-exitChan {
      return
   }
}

// Product 商品
type Product struct {
   Name string
}

// Producer 生产者
func Producer(storageChan chan<- Product, count int) {
   for {
      producer := Product{"商品:" + strconv.Itoa(count)}
      storageChan <- producer
      count--
      time.Sleep(time.Second)
      fmt.Println("生产了", producer)
      if count < 1 {
         return
      }
   }
}

// Logistics 物流公司
func Logistics(storageChan <-chan Product, shopChan chan<- Product) {
   for {
      product := <-storageChan
      shopChan <- product
      fmt.Println("运输了", product)
   }
}

// Consumer 消费者
func Consumer(shopChan <-chan Product, count int, exitChan chan<- bool) {
   for {
      product := <-shopChan
      fmt.Println("消费了", product)
      count--
      if count < 1 {
         exitChan <- true
         return
      }
   }
}
2.协程管道定时任务的应用
2.1需求分析

​ 1.定时执行某个任务,类似延时消息队列

​ 2.或者周期性的执行某个任务,类似定期同步某些数据

2.2实现原理

在这里插入图片描述

2.3代码实现:
package main

import (
   "fmt"
   "time"
)

func main() {
   //方式1:
   fmt.Println("当前时间:", time.Now())
   //timer := time.NewTimer(time.Second * 3)
   //t := <-timer.C //timer.C一个只读的管道

   //fmt.Println(t)

   //方式二:
   t := <-time.After(time.Second * 3) //源码可见,实际上NewTimer(d).C
   fmt.Println(t)
}
3.定时器的终止与重置

​ NewTimer, Stop, Reset

package main

import (
	"fmt"
	"math/rand"
	"time"
)

var flag bool = isStopTimer()

func main() {
	//方式1:
	fmt.Println("当前时间:", time.Now())
	timer := time.NewTimer(time.Second * 3)

	if flag {
		timer.Stop() //如果停止了timer,还去拿fatal error: all goroutines are asleep - deadlock!
	} else {
		t := <-timer.C //timer.C一个只读的管道
		fmt.Println(t)
	}
	
}

func isStopTimer() bool {
	rand.Seed(time.Now().UnixNano())
	tempInt := rand.Intn(2) + 18
	if tempInt >= 18 {
		fmt.Println("已经找到了大于18,结束timer")
		return true
	} else {
		return false
	}
}

func isResetTimer() int {
	rand.Seed(time.Now().UnixNano())
	tempInt := rand.Intn(4) + 19
	fmt.Println("已经找到",tempInt)
	return tempInt-18
}
4.需要每隔时间触发任务
4.1实现原理:

在这里插入图片描述

4.2代码实现
package main

import (
   "fmt"
   "time"
)

func main() {
   var count int = 0
   ticker := time.NewTimer(time.Second * 1)
   go func() {
      for {
         t := <-ticker.C
         fmt.Println("时间:", t.Format("2006-01-02 03:04:05PM"))
         count++
         if count > 2 {
            ticker.Stop()
         }
      }
   }()
   time.Sleep(time.Second * 10)
   fmt.Println("游戏结束")
}
4.3改造成任务队列
package main

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

func main() {
   var count int = 0
   var wg sync.WaitGroup
   wg.Add(1)
   ticker := time.NewTicker(time.Second * 1)
   go func() {
      defer wg.Done()
      defer ticker.Stop()
      for {
         t := <-ticker.C
         fmt.Println("时间:", t.Format("2006-01-02 03:04:05PM"))
         count++
         if count > 2 {
            return
         }
      }
   }()
   wg.Wait()
   fmt.Println("游戏结束")
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

chatGPT 国内版,嵌入midjourney AI创作工具

聊天GPT国内入口,免切网直达,可直接多语言对话,操作简单,无需复杂注册,智能高效,即刻使用.可以用作个人助理,学习助理,智能创作、新媒体文案创作、智能创作等各种应用场景! 地址&#xff1a; https://ai.wboat.cn/

56.微服务面试篇

目录 一、SpringCloud常见组件有哪些&#xff1f; 二、Nacos源码分析和Sentinel源码分析。 三、Nacos的服务注册表结构是怎样的&#xff1f; 四、Nacos如何支撑数十万服务注册压力&#xff1f; 五、Nacos如何避免并发读写冲突问题&#xff1f; 六、Nacos与Eureka的区别有…

locust 压测 websocket

* 安装 python 3.8 https://www.python.org/ py --version * 安装 locust pip install locust2.5.1 -i http://pypi.douban.com/simple/ pip install locust2.5.1 -i https://pypi.mirrors.ustc.edu.cn/simple/ locust -V 备注&#xff1a;-i 是切换下载源 * 安装依赖 pip ins…

ElasticSearch - networking配置global

版本8.11 单机部署了一个节点 在elasticsearch.yml中 配置了network.host: 8.8.8.8(之前为127.0.0.1) 但启动服务失败 报错信息为: BindTransportException: Failed to bind to 8.8.8.8:[9300-9399] 为啥要配置8.8.8.8 是因为参考的官方说明 Networking | Elasticsearch Gu…

Docker知识点整理

Docker和虚拟机技术的区别&#xff1a; 传统的虚拟机&#xff0c;可以虚拟出一条硬件&#xff0c;运行一个完整的操作系统&#xff0c;在这个操作系统上安装和运行所需的软件 容器内的应用可以直接运行在宿主 主机的内核中&#xff0c;容器没有自己的内核&#xff0c;也不用虚…

云上丝绸之路| 云轴科技ZStack成功实践精选(西北)

古有“丝绸之路” 今有丝绸之路经济带 丝路焕发新生&#xff0c;数智助力经济 云轴科技ZStack用“云”护航千行百业 沿丝绸之路&#xff0c;领略西北数字化。 古丝绸之路起点-陕西 集历史与现代交融&#xff0c;不仅拥有悠久的历史文化积淀&#xff0c;而且现代化、数字化发…

卡片C语言(2021年蓝桥杯B)

分析&#xff1a;我们用一个数组来记录卡牌&#xff0c;我们每使用一张卡牌&#xff0c;就减一张&#xff0c;当卡牌数为-1的时候&#xff0c;说明不够用了&#xff0c;此时我们就打印上一个组合的数字。 #include <stdio.h> int main(){int num[10],i,m,n,j;for(i0;i&l…

AIGC重塑教育:AI大模型驱动的教育变革与实践

目录 引言 AI与教育工作者 ​教育资源不平衡 引言 AI正迅猛地改变着我们的生活。 根据高盛发布的一份报告&#xff0c;AI有可能取代3亿个全职工作岗位&#xff0c;影响全球18%的工作岗位。在欧美&#xff0c;或许四分之一的工作可以用AI完成。另一份Statista的报告预测&…

Nginx 服务器安装及配置文件详解

1. 安装nginx 1.1 选择稳定版本 我们编译安装nginx来定制自己的模块&#xff0c;机器CentOS 6.2 x86_64。首先安装缺少的依赖包&#xff1a; # yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 这些软件包如果yum上没有的话…

springoot集成kafka

1.常见两种模式 2.高可用 和 负载均衡 组内:消费者 一个只能消费一个分区 组外:消费者消费是订阅者模式

【Https】工作流程

HTTPS 也是⼀个应用层协议。是在 HTTP 协议的基础上引入了⼀个加密层。 前言 由于Http是明文传输&#xff0c;因此如果有人想修改/截获数据都是非常容易&#xff0c;因此就出现了运营商劫持问题。 加密基础知识 明文密钥>密文 加密 密文密钥>明文 解密 对称加密和非对…

ssm基于HTML5的OA办公系统论文

基于HTML5的OA办公系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;作为一个一般的企业都开始注重与自己的信息展示平台&#xff0c;实现基于HTML5的OA办公系统在技术上已成熟。本文介绍了基于HTML5的OA办公系统的开发全过程。通过分析企业对于博客网站的需…

【Proteus仿真】【51单片机】视力保护仪

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使LCD1602液晶&#xff0c;按键、HC-SR04超声波、PCF8591 ADC、光敏传感器、蜂鸣器、LED等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示…

Linux基本操作

常用快捷键 按键 作用 Ctrld 键盘输入结束或退出终端 Ctrls 暂停当前程序&#xff0c;暂停后按下任意键恢复运行 Ctrlz 将当前程序放到后台运行&#xff0c;恢复到前台为命令fg Ctrla 将光标移至输入行头&#xff0c;相当于Home键 Ctrle 将光标移至输入行末&#xf…

LeetCode Hot100 146.LRU缓存

题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&…

编译Sqlite3记录

下载源文件&#xff1a; 下载地址&#xff1a;SQLite Download Page 打开QtCreator创建新的工程&#xff0c;选择纯C工程&#xff0c;将main.c删除&#xff0c;将下载的源码解压后的文件复制到并添加到工程中&#xff0c;其中的文件包括&#xff1a;sqlite3ext.h、sqlite3.h、…

威睿三合一电驱动系统斩获“2023汽车新供应链百强-金辑奖”

10月19日&#xff0c;2023第五届“金辑奖”颁奖盛典在上海圆满落幕。威睿公司“高效低噪碳化硅电驱动系统”在动力总成电气化领域脱颖而出&#xff0c;荣获“2023中国汽车新供应链百强”荣誉称号。 “金辑奖”由盖世发起&#xff0c;旨在“发现好公司推广好技术成就汽车人”&a…

iPhone 16 的电池供应可能来自印度

据英国《金融时报》报道&#xff0c;据报道&#xff0c;苹果已通知其供应链&#xff0c;包括中国德赛公司和台湾新普科技等电池供应商&#xff0c;其倾向于将 iPhone 16 的电池供应转移到印度。苹果鼓励供应商将现有产能迁往印度&#xff0c;以扩大该地区的生产规模。 鉴于电池…

ShenYu网关注册中心之Zookeeper注册原理

文章目录 1、客户端注册流程1.1、读取配置1.1.1、用于注册的 ZookeeperClientRegisterRepository1.1.2、用于扫描构建 元数据 和 URI 的 SpringMvcClientEventListener 1.2、扫描注解&#xff0c;注册元数据和URI1.2.1、构建URI并写入Disruptor1.2.2、构建元数据并写入Disrupto…

防火墙在网络安全中的作用有什么?部署模式有什么?

防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信息安全性的一种技术。 防火墙在网络安全中的作用主要有以下几个方面&#xff1a; 1.保护网络安全——…