• Stars
    star
    110
  • Rank 316,770 (Top 7 %)
  • Language
    Go
  • License
    MIT License
  • Created almost 4 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Waiting group for collecting goroutine information.

collgroup

Wait group for collecting goroutine information.

前 言

在go语言waitGrouperrGroup都是用来控制goroutine的并发的方式,前者只能等待所有goroutine执行完成之后再执行Wait()函数后面的代码并且不能捕获运行中的错误,而后者能解决在goroutine运行出现的错误还能继续,但是只能捕获到第一次出错的goroutine的错误信息。有时候我们需要让多个协程在其中几个出错的时候还能正常运行其他的协程,并且还能捕获到出错协程的相关信息,前面2个waitGrouperrGroup都不能够满足我们的需求,所以打算自己动手实现一个collectGroup

Get

go get -u github.com/higker/collgroup

需求分析

  • 能够支持context
  • 能够获取错误信息

当然我们使用errGroupchannel也可以实现,但是笔者想自己撸一个单独包。

应用案例1

我们在执行多个任务的时候,启动了多个协程,但是我们不能确定这些协程在运行的时候会不会出现问题,而出现了什么样的问题,怎么获取到error消息,现在我们通过collectGroup就可以实现了。

type task func() error

func TestCollGroup(t *testing.T) {

	// 创建一个collectGroup
	g := new(Group)
	// 模拟多任务
	tasks := []task{
		func() error {
			time.Sleep(4 * time.Second)
			fmt.Println("task 1 done.")
			return nil
		},
		func() error {
			time.Sleep(2 * time.Second)
			fmt.Println("task 2 done.")
			return nil
		},
		func() error {
			time.Sleep(3 * time.Second)
			fmt.Println("task 3 done.")
			return nil
		},
		// 出错任务
		func() error {
			time.Sleep(3 * time.Second)
			return errors.New("task 4 running error")
		},
		func() error {
			time.Sleep(3 * time.Second)
			return errors.New("task 5 running error")
		},
	}
	g.Errs = make(map[string]error, cap(tasks))
	for i, t := range tasks {
		g.Go(fmt.Sprintf("go-id-%s", cast.ToString(i)), t)
	}
	if g.Wait() {
		fmt.Println("Get errors: ", g.Errs)
	} else {
		fmt.Println("run all task  successfully!")
	}
}

output

=== RUN   TestCollGroup
    collect_group_test.go:34: task 2 done.
    collect_group_test.go:39: task 3 done.
    collect_group_test.go:29: task 1 done.
    collect_group_test.go:57: Get errors:  map[go-id-3:task 4 running error go-id-4:task 5 running error]
--- PASS: TestCollGroup (4.00s)
PASS
ok      github.com/higker/collgroup     4.012s

应用案例2

本案例是检测到一个错误就返回了,使用context完成

func TestWithContext(t *testing.T) {

	// 创建一个errGroup
	group, ctx := WithContext(context.Background())
	// 模拟多任务
	tasks := []task{
		func() error {
			time.Sleep(4 * time.Second)
			t.Log("向订单表加入消息....")
			return nil
		},
		func() error {
			time.Sleep(2 * time.Second)
			t.Log("更新库存消息....")
			return nil
		},
		func() error {
			time.Sleep(3 * time.Second)
			t.Log("发送用户通知.....")
			return nil
		},
		func() error {
			time.Sleep(4 * time.Second)
			return errors.New("用户扣款发送错误")
		},
	}

	for i, t := range tasks {
		group.Go(fmt.Sprintf("go-id-%s", cast.ToString(i)), t)
	}
	// group.Wait()
	// 监听任务出错了一个就返回
	<-ctx.Done()
	if len(group.Errs) > 0 {
		t.Log("group exit...任务出,拿到错误消息回滚业务....")
		t.Log("Get errors: ", group.Errs)
	}
}

output

go test -v

=== RUN   TestCollGroup
    collect_group_test.go:35: task 2 done.
    collect_group_test.go:40: task 3 done.
    collect_group_test.go:30: task 1 done.
    collect_group_test.go:58: Get errors:  map[go-id-3:task 4 running error go-id-4:task 5 running error]
--- PASS: TestCollGroup (4.00s)
=== RUN   TestWithContext
    collect_group_test.go:77: 更新库存消息....
    collect_group_test.go:82: 发送用户通知.....
    collect_group_test.go:72: 向订单表加入消息....
    collect_group_test.go:98: group exit...任务出,拿到错误消息回滚业务....
    collect_group_test.go:99: Get errors:  map[go-id-3:用户扣款发送错误]
--- PASS: TestWithContext (4.01s)
PASS
ok      github.com/higker/collgroup     8.013s

More Repositories

1

rust-artisan-guide

《Rust Artisan Guide: Building Reliable Projects》A book about hands-on programming with Rust.
Rust
313
star
2

typikon

Typikon lets you use markdown to write your online books.
Rust
287
star
3

vasedb

VaseDB is a NoSQL that supports multiple data types and transactions.
Go
254
star
4

gsql

GSQL is a structured query language code builder for golang.
Go
106
star
5

falsework

A tool crate to quickly build rust command line application.
Rust
101
star
6

gws

Go's web session library.
Go
84
star
7

sprout

Golang logging library supporting log retrieval.
Go
82
star
8

sms_bomber

sms bomber.
Go
57
star
9

owl

A file signature scanning tool for static analysis.
Go
48
star
10

ocr4j

ocr4j is a Java toolkit ocr4j.jar based on Tesseract-ocr.
Java
22
star
11

s2s

s2s is a command line tool for database reverse engineering.
Go
19
star
12

learning-rust-zh

个人的 rust 学习资料
Rust
14
star
13

RobotChat

一个使用Java基于免费的机器人聊天API开发的聊天网站🙃
Java
14
star
14

ApeTranslation

一个使用Electron技术💁‍♂️开发的跨平台桌面操作系统的翻译程序🔥
HTML
12
star
15

marionette

marionette 是一个通过golang实现的远控程序,中文名叫`牵线木偶`就好了。
Go
10
star
16

ds

common data structures implement by golang.
Go
8
star
17

applo

使用HTML、CSS、JavaScript遵循Google Material Design设计规范的web后台页面模版🍻
JavaScript
6
star
18

coffee

General programming toolkit for Golang.
Go
5
star
19

scg

A Rust sync group for a collection of thread to finish.
Rust
4
star
20

go_ranking_web

这是一个我使用go语言加redis的zset实现的一个在线实时展示主播积分榜的例子
Go
4
star
21

JettyGUIAdminTools

使用C#开发的Jetty Server容器的图形化管理工具😋
C#
4
star
22

FayProject

一个使用Java开发的在线用户卡密充值管理平台🌎
Java
4
star
23

Medical

一个Java开发的医疗系统💉
Java
4
star
24

DormitoryManage

使用Java+servlet+jsp+maven+el+JavaScript技术开发的大学宿舍自助管理系统
CSS
4
star
25

blog

my blog pages repository.
HTML
3
star
26

editor-develop-fonts

个人收藏的一些适用于程序员的开发字体包.
3
star
27

go-algorithm

go语言的算法基础
Go
3
star
28

ApeTranslationServer

一个提供爬起百度翻译接口的反向接口程序,能通过语言翻译,语言发音API服务🤩
Java
3
star
29

ccl_orderSystem

Java + MySQL + YDUI Touch + SpringBoot 开发的简单在线自助点餐系统🔥
JavaScript
2
star
30

typhoon

使用Rust编写构建一个微内核操作系统取名typhoon.
2
star
31

draw.io

2
star
32

csrf_demo

CSRF 攻击演示
Go
2
star
33

weer

Weer is weather command line apps🌞.
Go
2
star
34

auula

My self introduction😜
2
star
35

roger

Roger is distribution Key-value cache storage service for golang.
Go
2
star
36

tcpl

The C programming learning.
C
2
star
37

gsql-rs

gsql-rs is a structured query language code builder for Rust.
Rust
2
star
38

goconvey-example

goconvey testing example
Go
2
star
39

go_generic_code

Generic programming in Go.
Go
2
star
40

cmdbox

Python
2
star
41

higker.github.io

👨‍💻‍个人博客📚
HTML
2
star
42

ticket-ssm

使用Java的SSM技术栈开发一款在线景区售票系统
JavaScript
2
star
43

open-shell

Shell
2
star
44

kvbase

本计划已经更新至kalasa项目.
2
star
45

math_game

使用Rust实现的人工智能数学出题机器人
2
star
46

JavaReptile

Java爬虫小程序集合🌈驾考程序答案爬取🐜
Java
2
star
47

poem.rs

Poem | A high-performance rust web framework | Homepage.
CSS
2
star
48

auto-sh

auto-sh这个仓库是本人平常编写和收藏的Linux的shell自动化运维脚本分享给你大家!!!
Shell
2
star
49

awesome-rust-web

HTML
2
star
50

tts_tedu

一个在线学习🏫JavaSE的好仓库
CSS
2
star
51

JavaScript_Learning

JavaScript学习📒笔记分享
JavaScript
2
star
52

ubuntu-ppa

Panda Desktop PPA Documentation
Shell
2
star
53

mapisto

Mapisto 是一款命令行数据库工具,可以通过命令行生成表对应的Golang、Java、TypeScript语言的类型结构。
Go
2
star
54

openforum

An open source forum system 💬 with more diverse community features 🌈 , developed in Java ☕️ .
2
star
55

try

Exception capture library for Golang.
Go
2
star
56

XQuery

The object–relational mapping library for rust.
Rust
2
star
57

Java-Code

个人日常帮别人写一些程序和私活Java代码仓库 ,真正意义上的仓库2333,只要是Java代码就往这里面扔。
JavaScript
1
star
58

js_guide

JavaScript: The Definitive Guide (seventh edition) Book source code.
JavaScript
1
star
59

leetcode-go

通过Go语言解决LeetCode问题.
Go
1
star
60

christmas-tree

JavaScript
1
star
61

ENG-mui-app

1
star
62

go-playground

可以方便运行、格式化和分享 Go 代码,可以实现没有 Go 环境运行 Go 代码。
JavaScript
1
star
63

Kali-Linux-Demo

kalilinux学习笔记
1
star
64

octopus

octopus is server performance indicators monitoring program
CSS
1
star
65

google-outline-server-install

Shell
1
star
66

java-algorithm

本包手撕一些算法实现.
Java
1
star
67

IP-Info

Golang图形化编程实现一个ip地址查询工具
Go
1
star
68

qrcode-go

Golang genreate tool library of QrCode.
Go
1
star
69

TaleWindowUpData

C#
1
star
70

go-common

Common Develop tool package for Go
Go
1
star
71

hello-wasm-go

go webassembly example
JavaScript
1
star
72

wechat-code

收集微信公众号`一手代码一首诗`文章中的代码仓库
Go
1
star
73

smalltalk

一个 Web 端在线会议室程序,可以在线开启聊天室房间允许游客加入讨论问题,支持分享链接加入,和房间密码加入。
1
star
74

Kmall-SSM

SSM开发的一个在线商城🔥
Java
1
star
75

bottle-docs

Bottle Storage Engine Use Dcument.
1
star
76

codeq

AI code assistant for large language models.
1
star
77

PushSystem-Java

这个一个使用JDK1.6开发在线机器故障报修系统,别人遇到 bug 要解决外包给我的项目。
HTML
1
star