iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GoLangchannel使用介绍
  • 344
分享到

GoLangchannel使用介绍

2024-04-02 19:04:59 344人浏览 泡泡鱼
摘要

目录停止信号任务定时解耦生产方和消费方控制并发数停止信号 channel 用于停止信号的场景还是挺多的,经常是关闭某个 channel 或者向 channel 发送一个元素,使得接收

停止信号

channel 用于停止信号的场景还是挺多的,经常是关闭某个 channel 或者向 channel 发送一个元素,使得接收 channel 的那一方获知道此信息,进而做一些其他的操作。

任务定时

与 timer 结合,一般有两种玩法:实现超时控制,实现定期执行某个任务。

有时候,需要执行某项操作,但又不想它耗费太长时间,上一个定时器就可以搞定:

select {
	case <-time.After(100 * time.Millisecond):
	case <-s.stopc:
		return false
}

等待 100 ms 后,如果 s.stopc 还没有读出数据或者被关闭,就直接结束。这是来自 etcd 源码里的一个例子,这样的写法随处可见。

定时执行某个任务,也比较简单:

func worker() {
	ticker := time.Tick(1 * time.Second)
	for {
		select {
		case <- ticker:
			// 执行定时任务
			fmt.Println("执行 1s 定时任务")
		}
	}
}

每隔 1 秒种,执行一次定时任务。

解耦生产方和消费方

服务启动时,启动 n 个 worker,作为工作协程池,这些协程工作在一个 for {} 无限循环里,从某个 channel 消费工作任务并执行:

func main() {
	taskCh := make(chan int, 100)
	Go worker(taskCh)
    // 塞任务
	for i := 0; i < 10; i++ {
		taskCh <- i
	}
    // 等待 1 小时 
	select {
	case <-time.After(time.Hour):
	}
}
func worker(taskCh <-chan int) {
	const N = 5
	// 启动 5 个工作协程
	for i := 0; i < N; i++ {
		go func(id int) {
			for {
				task := <- taskCh
				fmt.Printf("finish task: %d by worker %d\n", task, id)
				time.Sleep(time.Second)
			}
		}(i)
	}
}

5 个工作协程在不断地从工作队列里取任务,生产方只管往 channel 发送任务即可,解耦生产方和消费方。

finish task: 1 by worker 4
finish task: 2 by worker 2
finish task: 4 by worker 3
finish task: 3 by worker 1
finish task: 0 by worker 0
finish task: 6 by worker 0
finish task: 8 by worker 3
finish task: 9 by worker 1
finish task: 7 by worker 4
finish task: 5 by worker 2

控制并发数

有时需要定时执行几百个任务,例如每天定时按城市来执行一些离线计算的任务。但是并发数又不能太高,因为任务执行过程依赖第三方的一些资源,对请求的速率有限制。这时就可以通过 channel 来控制并发数。

下面的例子来自《Go 语言高级编程》:

var limit = make(chan int, 3)
func main() {
    // …………
    for _, w := range work {
        go func() {
            limit <- 1
            w()
            <-limit
        }()
    }
    // …………
}

构建一个缓冲型的 channel,容量为 3。接着遍历任务列表,每个任务启动一个 goroutine 去完成。真正执行任务,访问第三方的动作在 w() 中完成,在执行 w() 之前,先要从 limit 中拿“许可证”,拿到许可证之后,才能执行 w(),并且在执行完任务,要将“许可证”归还。这样就可以控制同时运行的 goroutine 数。

这里,limit <- 1 放在 func 内部而不是外部,原因是:

如果在外层,就是控制系统 goroutine 的数量,可能会阻塞 for 循环,影响业务逻辑。

limit 其实和逻辑无关,只是性能调优,放在内层和外层的语义不太一样。

还有一点要注意的是,如果 w() 发生 panic,那“许可证”可能就还不回去了,因此需要使用 defer 来保证。

到此这篇关于golang channel使用介绍的文章就介绍到这了,更多相关Go channel内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GoLangchannel使用介绍

本文链接: https://www.lsjlt.com/news/121283.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • GoLangchannel使用介绍
    目录停止信号任务定时解耦生产方和消费方控制并发数停止信号 channel 用于停止信号的场景还是挺多的,经常是关闭某个 channel 或者向 channel 发送一个元素,使得接收...
    99+
    2024-04-02
  • ZookeeperZkClient使用介绍
    目录前言1、创建会话2、创建节点3、删除节点4、获取子节点5、获取数据(节点是否存在、更新、删除)前言 接下来,还是从创建会话、创建节点、读取数据、更新数据、删除节点等方面来介绍如何...
    99+
    2024-04-02
  • MinIO介绍使用
    MinIO介绍使用 MinIO 介绍 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。 MinIO 英文官网 MinIO 中文官网 注意:中...
    99+
    2023-09-02
    docker linux java
  • SpringBeanDefinition使用介绍
    目录1. 前言2. BeanDefinition2.1 AttributeAccessor2.2 BeanMetadataElement2.3 BeanDefinition2.4 A...
    99+
    2023-01-04
    Spring BeanDefinition作用 Spring BeanDefinition
  • JS.findElementById()使用介绍
    复制代码 代码如下: his.findElementById = function (identifier, frame) { if (!frame) { frame = windo...
    99+
    2022-11-15
    findElementById
  • puppet介绍、使用
    Puppet是一个自动化配置管理工具,可以帮助管理和部署大规模的计算机系统和网络设备。它允许用户通过定义所需的系统状态和配置,然后自...
    99+
    2023-09-23
    puppet
  • PreferenceActivity使用介绍
    PreferenceActivity是Android中的一个界面组件,用于展示和编辑应用程序的设置选项。它继承自Activity,并...
    99+
    2023-09-14
    使用
  • VuePostCSS的使用介绍
    目录PostCSS使用安装依赖运行使用第三方插件autoprefixer使用第三方插件postcss-preset-env使用第三方插件postcss-pxtorem运行的新方式Po...
    99+
    2023-02-06
    Vue PostCSS Vue PostCSS的使用
  • jQuery cdn使用介绍
    jQuery是一个快速、小巧、功能丰富的JavaScript库。使用jQuery可以简化HTML文档的遍历、事件处理、动画等操作。j...
    99+
    2023-08-17
    jQuery
  • Zookeeper Curator使用介绍
    目录1、添加依赖2、创建会话3、创建节点4、删除节点5、获取数据6、更新数据从编码风格上来讲,curator提供了基于Fluent的编程风格支持 1、添加依赖 在pom.xml文件中...
    99+
    2024-04-02
  • fastjson2 介绍及使用
    目录 前言一、导入fastjson2依赖二、json对象与json数组的创建json对象创建json数组创建 三、json对象取值与json数组遍历取值json对象取值json数组遍历取值 四、json对象与字符串的转换js...
    99+
    2023-08-18
    java fastjson2 fastjson fastJson
  • Apache介绍及使用
    Apache的介绍 Apache全称:Apache HTTPD Server ;是Apache基金会的一个开源网页服务器,可以在大多数计算机操作系统中运行。Apache提供的服务器又称为:补丁服务器 ...
    99+
    2023-09-17
    apache php 服务器
  • ehcache 3.* 使用介绍
    官网地址:http://×××w.ehcache.org/documentation/3.6/getting-started.html    根据官网的说明使用起来非常简单,尤其是在3.0之后, 不管事xml配置文件还是链式编码配置。先看示...
    99+
    2023-01-31
    ehcache
  • Android WorkManager使用介绍
    一、引言   WorkManager 是google提供的异步执行任务的管理框架,是 Android Jetpack 的一部分,会根据手机的API版本和应用程序的状态来选择适当的方式执行任务。   在...
    99+
    2023-09-07
    android
  • Android ViewBinding使用介绍
    目录一、kotlin-android-extensions二、ViewBinding使用1.gradle配置2.在Activity 使用3.在Fragment使用4.在Adapter...
    99+
    2024-04-02
  • SVN介绍和使用
    文章目录 SVN的介绍SVN是什么作用 安装包下载SVN的使用检出提交显示日志更新 patch的使用创建使用 SVN的介绍 SVN是什么 SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分...
    99+
    2023-08-19
    svn
  • Python中itertools简介使用介绍
    目录Python中itertools模块一、 简介二、 使用介绍1、 常用迭代器1.1 chain1.2 groupby2、 无穷迭代器2.1 count2.2 cycle2.3 r...
    99+
    2022-12-28
    Python中itertools Python itertools详解 Python itertools
  • mydumper工具使用介绍
    背景:mysqldump mysqlpump mydumper 三种逻辑备份工具的比较 mysqlpump的介绍(转):http://www.cnblogs.com/zhoujinyi/p/5684903...
    99+
    2024-04-02
  • Steamcommunity302使用教程介绍
      Steamcommunity302怎么使用?最近有用户询问这个问题,Steam是一款好用的游戏平台,但是也会遇到好友系统连接不上的情况,而Steamcommunity302就是为了解决这个问题推出的,那么怎么使用呢?   Steamc...
    99+
    2023-09-08
    服务器 Powered by 金山文档
  • PythonFlask框架使用介绍
    目录1. 数据库连接池2. wtfroms3. 信号3.1 内置信号3.2 使用信号3.3 自定义信号4. 多app应用5. flask-script5.1 快速使用5.2 自定制命...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作