首页 > 其他分享 >go【goroutine】

go【goroutine】

时间:2023-04-19 10:56:47浏览次数:28  
标签:ch 调用者 tr goroutine chan context go

1. goroutine

1. 重点

1.要搞清楚goroutine什么时候退出
2. 控制goroutine退出
3. 把并发给调用者

 

2. 代码示例

package main

import (
	"context"
	"fmt"
	"time"
)

//1. 使用chan创建
//2 run函数消费chan,做数据上报
//3 run函数交给调用者执行, run调用结束之后将stop发送信号, 当Shutdown时候可以同stop来知道他什么时候退出, 然后通过close(t.ch),可以让整个RUN 的goroutine退出

// 重点
// 1.要搞清楚goroutine什么时候退出
// 2. 控制goroutine退出
// 3. 把并发给调用者
func main() {
	tr := NewTracker()
	// 1。 把并发行为给调用者
	go tr.Run()
	_ = tr.Event(context.Background(), "test")
	_ = tr.Event(context.Background(), "test")
	_ = tr.Event(context.Background(), "test")
	ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))
	defer cancel()
	tr.Shutdown(ctx)
}

func NewTracker() *Tracker {
	return &Tracker{ch: make(chan string, 10)}
}

type Tracker struct {
	ch   chan string
	stop chan struct{}
}

func (t *Tracker) Event(ctx context.Context, data string) error {
	select {
	case t.ch <- data:
		return nil
	case <-ctx.Done():
		return ctx.Err()
	}
}

func (t *Tracker) Run() {
	for data := range t.ch {
		time.Sleep(1 * time.Second)
		fmt.Println(data)
	}
	t.stop <- struct{}{}
}

func (t *Tracker) Shutdown(ctx context.Context) {
	close(t.ch) //可以让run的goroutine退出
	select {
	case <-t.stop:
	case <-ctx.Done():
	}
}

 

标签:ch,调用者,tr,goroutine,chan,context,go
From: https://www.cnblogs.com/wanghhhh/p/17330547.html

相关文章

  • Golang 知识点
    make和new的区别:make用于创建切片、映射和通道,返回的是创建类型的引用。new用于创建任意类型的指针,返回的是该类型的指针。//make用法示例slice:=make([]int,5)//创建一个包含5个元素的整型切片//new用法示例varpointer*intpointer=new(int)//创......
  • go语言中如何把数字转换成字节切片并在网络中传输
    客户端:先把数字转换成uint32类型:varpkgLen=uint32(len(data))再定义一个字节切片:varbuf=make([]byte,4)最后通过encoding.binary包中的方法,把无符号数字装载到字节切片中:binary.BigEndian.PutUint32(buf[0:4],pkgLen)这样就可以在网络中发送数字了:conn.Wri......
  • 在Go语言中,如何优化内存使用效率?
    在Go语言中,可以通过以下几种方式来优化内存使用效率:避免使用过多的内存尽可能地避免使用过多的内存是最有效的内存优化方法之一。在编写代码时,应该尽可能地避免使用全局变量和大量的临时变量。同时,可以使用常量、静态变量和缓存等方式来避免频繁地分配和释放内存。及时释放不......
  • django查询一周内的数据,一月内的数据,一年内的数据
    首先是当前时间的确定,对于年月日,orm模型都有对应的方法直接查询,周是没有方法直接查询的,我是没有找到这个方法,只能间接的查询。cur_time=datetime.datetime.now()#如果数据库保存的是UTC时间,程序不会蹦但是会提示你这不是本地时间now_time_utc=datetime.datetime.utcnow......
  • Django框架模版渲染与过滤器使用
    前端模版使用过滤器,如时间格式化等'''都是在前端页面中使用'''#default 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。{{value|default:"nothing"}}#给value这个值设置一个默认值,如果value没有传值或者值为空的话就显示nothing#length 返回值的......
  • Django笔记二十四之数据库函数之比较和转换函数
    本文首发于公众号:Hunter后端原文链接:Django笔记二十四之数据库函数之比较和转换函数这一篇笔记开始介绍几种数据库函数,以下是几种函数及其作用Cast转换类型Coalesce优先取值Greatest返回较大值Nullif值相同返回None1、model准备这一篇笔记我们主要用到Author......
  • LeetCode:Search Algorithm
    LeetCode:SearchAlgorithm1\FirstuniquecharAlgorithmDesign利用字符数量的有限性,通过数组来映射(避免Hash_map的高复杂度)注意数组声明为intA[26]而不是charA[26];if(s=="")return''; intA[26]={0,0}; for(inti=0;i<s.length();i++){ A[s[i]-......
  • 编写你的第一个 Django 应用程序,第3部分
    本教程从教程2 停止的地方开始。我们是继续网络投票应用程序,并将专注于创建公众界面–“视图”。在我们的投票应用程序中,我们将有以下四个视图:问题“索引”页面–显示最新的几个问题。问题“详细信息”页面–显示问题文本,没有结果,但用表格投票。问题“结果”页面......
  • django4.0 项目集成 xadmin 后台管理
    Djangoxadmin是Django框架的一个第三方应用程序,它提供了许多基于Web的界面来管理您的Django应用程序。1.安装xadmin  pipinstallhttps://github.com/sshwsfc/xadmin/tarball/master 如果你的django版本过高,和我一样是使用的4.0,会出现不兼容等,多种报错。 请将下......
  • Docker快速入门 三(dockerfile常用命令,dockerfile构建django项目,docker私有仓库,docker-
    目录Docker一、Dcokerfile常用命令二、Dockerfile构建Django项目三、Docker私有仓库1、简介2、镜像传到官方仓库3、镜像分层4、搭建私有仓库四、Docker-conpose1、Docker-conpose部署项目1、新建flask项目2、编写dockerfile3、编写docker-conpose的yml文件4、启动docker-compoes2......