Go实现两个Goroutine通信

2023-11-12

实现两个goroutine通信,要求如下

  1. 实现pingpong效果
  2. 保证程序能任意时长执行,且收到ctrl+c信号之后,全身而退(即保证各个goroutine完整退出)
  3. 在第三个goroutine中,可随时查找前两个goroutine各自发送了多少个消息,并可设置各自pingpong的频率,如果同时有一万个goroutine过来查找呢
  4. 符合编码规范的前提下,代码质量控制在两位数

答案

package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
	"time"
)

var interval = 5 * time.Second

func main() {
	ch1 := make(chan string, 0)
	ch2 := make(chan string, 0)
	sigs := make(chan os.Signal, 1)
	count1Send := 0
	count1Receive := 0
	count2Send := 0
	Count2Receive := 0

	type check chan int
	control := make(chan check, 10)

	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

	go func() {
		for {
			ch1 <- "ping"
			count1Send++

			time.Sleep(interval)

			select {
			case <-ch2:
				count1Receive++
			}
		}
	}()

	go func() {
		for {
			select {
			case <-ch1:
				Count2Receive++
			}

			time.Sleep(interval)

			ch2 <- "posng"
			count2Send++
		}
	}()

	go func() {
		for {
			c := <-control

			<-c

			fmt.Println("count1Send:", count1Send)
			fmt.Println("count2Send:", count2Send)
			fmt.Println("count1Receive:", count1Receive)
			fmt.Println("count2Receive:", Count2Receive)

			close(c)
		}
	}()

	// check
	go func() {
		for {
			time.Sleep(5 * time.Second)

			c := make(check, 1)
			c <- 1

			control <- c
		}
	}()

	select {
	case <-sigs:
		close(ch1)
		close(ch2)
		close(control)
		fmt.Println("close program")
	}
}

func setInterval(newInterval time.Duration) {
	interval = newInterval
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go实现两个Goroutine通信 的相关文章

随机推荐

  • 【java养成】:案例:学生管理系统、斗地主洗牌

    案例学习 学生管理系统 学生管理系统 参考书籍 系统首页 用于显示系统的所有操作 并根据用户在控制台的输入选择需要使用的功能 查询功能 用户选择该功能后 在控制台打印所有学生的信息 添加功能 用户选择该功能后 要求用户在控制台输入学生学号
  • Python打印九九乘法表(Python)

    算法 打印九九乘法表 方法一 1 运用range 函数 参数值含左不含右 2 Python的print函数默认换行 这里通过把九九乘法表中在一行的转化成字符串类型再打印的方法解决 3 在每个乘式的后面加一个空格来分隔乘式 for i in
  • NYOJ278 排队 (约瑟夫问题)

    原题链接 参考 百科 约瑟夫问题 经典题 附ac代码 include
  • Pytorch 的损失函数Loss function使用详解

    参考 Pytorch 的损失函数Loss function使用详解 云 社区 腾讯云 目录 1 损失函数 1 nn L1Loss 2 nn SmoothL1Loss 3 nn MSELoss 4 nn CrossEntropyLoss 5
  • 虚拟文件系统VFS框架

    复杂度3 5 机密度3 5 最后更新2021 05 01 AIX虽然仅内置支持五种类型的文件系统 jfs jfs2 nfs CDROM ramfs 远少于Linux 但其设计并不局限于某一种特定的文件系统 而是采用虚拟文件系统的概念 以一种
  • 蓝桥杯C/C++省赛:高斯日记

    目录 题目描述 思路分析 AC代码 题目描述 大数学家高斯有个好习惯 无论如何都要记日记 他的日记有个与众不同的地方 他从不注明年月日 而是用一个整数代替 比如 4210 后来人们知道 那个整数就是日期 它表示那一天是高斯出生后的第几天 这
  • 数据库、表数据的三种删除方式

    第一种 drop table 第二种 delete table t第三种 runcate table 三种方式的区别 Drop table删表 常用于正对表 表结构都会被删除 而delete table和truncate table 只删除
  • 进 4 球得 1 分,阿根廷败北背后的科技与狠活

    内容一览 11 月 22 日 世界杯 C 组首场比赛 沙特阿拉伯 2 1 反超阿根廷 今天我们将逐一盘点阿根廷进 4 球得 1 分背后的科技与狠活 关键词 世界杯 VAR 半自动越位技术 沙特爆冷逆袭 2 1 反超阿根廷 2022 年世界杯
  • 图像增强的两个评价指标:峰值信噪比PSNR和结构相似度SSIM

    两种图像增强评价指标 PSNR和SSIM 峰值信噪比PSNR 结构相似度SSIM python实现 SSIM的代码 PSNR的代码 图像增强的评价指标在像素层面上通常包含平均绝对误差 MAE 均方误差法 MSE 峰值信噪比 PSNR 以及结
  • 第6天:分割处理与中断处理

    6 1 分割处理 6 1 1 bootpack c拆分 6 1 2 MakeFile整理 使用了一般规则 gas c Makefile CC1 o gas c nas gas Makefile GAS2NASK gas nas obj na
  • NumPy使用

    NumPy数组的创建 1 创建数组 array 2 制定数组类型 dtype 3 创建特殊数组 1 元素全为0 zeros 2 元素全为1 ones 3 指定元素范围 arange 4 线段性元素 linspace NumPy数组属性 1
  • 分词工具使用系列——sentencepiece使用

    分词工具使用系列 第一章 sentencepiece使用 第二章 jieba工具使用 文章目录 分词工具使用系列 前言 细说分词 一 sentencepiece是什么 二 sentencepiece使用步骤 准备文本 训练模型 使用模型 前
  • JavaScript简单实现拼图小游戏(附源码和资源)

    JavaScript简单实现拼图小游戏 附源码及资源 JavaScript代码68行 是3年前刚学JavaScript的时候写的 思想很简单 分享一下 拼图是4 4的 共三张图 按照命名规则添加其他图片也可以 资源已上传 下载地址 http
  • Hystrix实现断路器、服务降级、线程隔离

    了解Hystrix之前首先需要明白几个概念 雪崩效应 断路器 熔断机制 服务降级 线程隔离 雪崩效应 默认情况下 tomacat只有一个线程池去处理请求 这样在高并发的情况下大量的请求访问同一个服务器接口 线程池中所有的线程都用来处理访问这
  • Linux下某内网主机无法连接,通过添加路由表解决;路由表等网络知识学习

    1 问题描述与解决 这里要记录一个很奇怪的问题 当然是对我这种新手来说的 问题描述如下 当前一台Ubuntu 18 04主机在校园网环境中 同济大学 上海嘉定 上海电信 在apt安装软件的时候经常出现无法连接或者哈希值不匹配的问题 如图 这
  • 又一版A+B问题(注意细节)

    题目描述 输入两个不超过整型定义的非负10进制整数A和B lt 231 1 输出A B的m 1 lt m lt 10 进制数 输入 输入格式 测试输入包含若干测试用例 每个测试用例占一行 给出m和A B的值 当m为0时输入结束 输出 输出格
  • HCIE-Cloud Computing v2.0 lab机考全讲解

    阅读说明 中的内容是 考生的经验 建议 理解 五星表示为 必须背下来 文章目录 一 准备 题型介绍 考试环境 考试地址和密码 必知流程 二 实战 2 1 宏观方面 整体讲解 2 1 1 拓扑 类型接口 2 1 2 简述 2 2 微操 分题型
  • python画正方形的代码_python绘制正方形螺旋线的代码分享

    python绘制正方形螺旋线的代码分享 发布时间 2020 04 28 09 56 56 来源 亿速云 阅读 219 作者 小新 这篇文章主要为大家详细介绍了python绘制正方形螺旋线的代码分享 文中示例代码介绍的非常详细 具有一定的参考
  • Vite和Webpack如何使用CDN包

    为了精简打包输出的dist目录大小 我们可以引入CDN外部包的方式 来缩小打包的体积 加快打包速度 这里介绍Vite和Webpack中如何引入React CDN外部包 一 Vite引入CDN包 1 安装插件 npm i vitejs plu
  • Go实现两个Goroutine通信

    实现两个goroutine通信 要求如下 实现pingpong效果 保证程序能任意时长执行 且收到ctrl c信号之后 全身而退 即保证各个goroutine完整退出 在第三个goroutine中 可随时查找前两个goroutine各自发送