golang 多协程处理任务

[Golang]实现一个带有等待和超时功能的协程池 - 类似Java中的ExecutorService接口实现 对于支持CSP并发编程模型的Golang而言,要实现一个协程池是非常简单的。对于习惯了基于线程模型完成并发编程的开发同学,可能初次接触会有点难理解,但是俗话说"书读百遍其义自见",百来行的代码也并不多。 我们的目标是实现一个具有以下特性的协程池(熟悉Java的话,基本上就是实现了ExecutorService接口中的主要方法): 能够指定任务队列长度和工作协程的数量使用任务队列 能够支持启动和停... 阅读详情
package main
 
import (
	"fmt"
	"runtime"
)
 
var workers = runtime.NumCPU()
 
type result struct {
	jobname    string
	resultcode int
	resultinfo string
}
 
type job struct {
	jobname string
	results chan<- result
}
 
func main() {
	jobnames := []string{"1", "2", "3", "4", "5", "6", "7", "8"}
	dorequest(jobnames)
}
 
func dorequest(jobnames []string) {
 
	// 定义需要的channels切片
	jobs := make(chan job, workers)
	results := make(chan result, len(jobnames))
	done := make(chan struct{}, workers)
 
 	/**
 	 * 把任务写入 JobCh通道 
 	 **/
 	go func( jobs chan <- job, jobnames[]string, results chan <- result){
 		for _, jobname := range jobnames {
			jobs <- job{jobname, results}
		}
		close(jobs)
 	}( jobs, jobnames, results)

 	/**
 	 * 开启n个协程处理任务
 	 **/
	for i := 0; i < workers; i++ {
		go func( done chan <- struct{}, jobs <- chan job){
			for job := range jobs {
				job.do()
			}
			done <- struct{}{}
		}( done, jobs)
	}
	
	/**
	 * 查看任务是否完成
	 **/
	go func( done <- chan struct{}, results chan result){
		for i := 0; i < workers; i++ {
			<-done
		}
		close(results)
	}( done, results)

	/**
	 * 取出结果
	 **/
	for result := range results {
		fmt.Printf("done: %s,%d,%s\n", result.jobname, result.resultcode, result.resultinfo)
	}
}
func (job job) do() {
	fmt.Printf("... doing work in [%s]\n", job.jobname)
 
	// 模拟处理结果
	if job.jobname == "8" {
		job.results <- result{job.jobname, 0, "ok"}
	} else {
		job.results <- result{job.jobname, -1, "error"}
	}
}

Go语言中的多核调度 Go语言中的多核调度 浙江大学 14级软件工程 李自乐   近年来,随着工业技术的发展,服务器的CPU数量越来越多,动辄几十核心。为了发挥多核的优势,大多数程序都会采用多线程的方式来利用多核。另外,服务器编程一般都涉及较多的IO,包括网络或者外存,同步阻塞的IO对于大多数应用环境是一种很糟糕的方法: Fd.Read(); 这种语句一般在文件读准备完成之后会返回,但是文件的读取(这里的文件 阅读详情

相关推荐

从零开发区块链应用(十)--golang协程使用

文章目录一、什么是并发1.1 并发定义1.2 并发的好处二、什么是协程2.1 协程定义2.2 协程的优点三、golang协程实践 一、什么是并发 1.1 并发定义 为了更有意思的解释这个概念,我借用知乎上的一个回答:你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你

J_Lee 1337

golang中多协程处理

此代码使用了一个无缓冲通道,并且在一个单独的 goroutine 中等待所有协程完成后关闭通道。或者,也可以根据实际情况选择一个较大的固定容量作为缓冲通道的容量,以提高性能,但要确保这个容量足够大以避免阻塞。有一个新的 goroutine 开始执行任务,并且在这个 goroutine 完成任务后,需要等待一个计数的减少。这段代码的目的是对一个包含整数的切片进行并发处理,将每个整数乘以 2,并将处理后的结果收集到一个结果切片中。的计数变为零,表示所有被跟踪的 goroutine 都已完成任务。

xinyu111sa的博客 487

平头哥面试——芯片工程师面经

有5个成递增关系的32bit地址值,彼此之间的间隔大小不确定,可以把他们当成parameter来输入模块,现有一个32bit输入数据,要求用尽量少资源去的判断这个数处于哪2个地址之间(地址区间),并且输出区间号。a)后续大概会在9月下旬谈具体的薪资,他们现在也没想好今年应届生的薪资该给多少,到时候如果可以签三方的话可能会跳过意向书环节直接发offer,谈薪资肯定是通过电话来。b. 这边的CPU是自己研制的(玄铁),成都这边主要做存储和网络,都有SOC。a. 成都这边的网络部门具体做的业务有哪些?

FPGA/MATLAB学习教程/源码/项目合作开发 2688

go golang 链式开启多协程处理数据 并发

一、大体思路 把所有要处理的方法放在同一个切片当中,然后循环去开启多个协程处理这些方法 二、具体做法 1.定义两个结构体 用来存储要处理的方法和存储它下一个要多协程处理的方法,主要目的是要链式的连接下去 //定义一个接口 起到一个连接作用 type job interface { doItJob() error } //多个协程一次做的事情 并且实现job这个接口 type JustDoIt struct { fn []func() //多协程要处理的方法 nextFunc job

疾风行的博客 2264

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2597

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

golang多协程

golang代码。

jiangchao98的博客 413

电磁阀颤振工作原理

颤振 颤振,弹性结构在均匀气(或液)流中受到空气(或液体)动力、弹性力和惯性力(见达朗伯原理)的耦合作用而发生的大幅度振动,它是气动弹性力学中最重要的问题之一。 随着机电液一体化技术的发展,电液比例控制技术的应用越来越广泛。电液比例控制系统范围较广,在液压传动与控制过程中,系统能够接受模拟信号或数字信号,使输出的流量或压力连续成比例地变化,都属于此类。该控制系统的优点是充分利用了液压控制与电气控制的长处,即功率传递靠液压,信号处理靠电气的优化措施。 电液比例控制原理与要求 液压控制系统中两个最重要的被控参数

小幽余生不加糖 1万+

Golang协程详解

golang 协程引入,原理讲解,GMP调度模型详解,调度器讲解与流程分析

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 3903

【施磊】C++课程笔记目录

【C++编程】施磊老师C++笔记目录

GeniusAng的博客 4122

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

本教程详细介绍了如何从零开始配置QMK固件的OLED显示屏,实现个性化键盘显示。首先,文章解释了OLED显示屏的基本概念及其在键盘中的应用,并介绍了I2C和SPI两种通信方式。接着,教程逐步指导用户如何在QMK固件中启用OLED功能,包括在rules.mk中启用OLED、在halconf.h和mcuconf.h中配置I2C功能,以及在config.h中设置I2C和OLED参数。最后,教程展示了如何在keymap.c中编写代码,实现OLED显示内容,并提供了进阶定制功能,如显示当前层信息、按键状态和QMK L

Despacito0o的博客 578

Golang 两个携程交替输出1-10

Golang 两个携程交替输出1-10 百度搜索了一些相关话题,感觉不是很好所以自己写了一个。技术栈waitgroup主进程等待,context携程退出,chan通信。理论上有这三点基本都可以,不过感觉个人实现的还不是很完美,望各位指正~ func Test4(t *testing.T) { s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} wg := sync.WaitGroup{} wg.Add(1) //注意这里为什么是1不是2:虽然是两个携程同时在

xiaohenghengmua的博客 878

【100%通过率】2023华为od机试C卷【电脑病毒感染】Java&Go 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 2860

go多协程查mysql_一种 golang 实现 多协程任务处理的套路

# 一种 golang 实现 多协程任务处理的套路## 那么是什么样的任务呢,一般是在生产者-消费者模式的消费者进程 ,举几个例子1. 消费kafka 数据2. 消费redis 数据3. 轮询处理数据库数据4. ...## 下面来分析一下1. 业务逻辑处理协程到底多少个呢 ?处理一个数据 就 go 一个吗,也可以不过有点粗暴,协程也不是越多越好,调度也是要好性能的所以还是控制一下,一般吧 弄个c...

weixin_35692916的博客 766

【QT开发教程】Qt中的数据加密与解密

在现代应用程序中,数据加密与解密是保护敏感信息的重要手段。Qt本身并不直接提供数据加密与解密的支持,但可以使用第三方库,如OpenSSL或Crypto++,来实现这一功能。本文将介绍如何在Qt中使用OpenSSL进行数据加密与解密,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 1154

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【博客310】Go多协程协助处理一个任务

内容: 记录go使用多协程处理一个任务,以加快处理速度 思路: 协助处理任务时主要有以下几大类goruntine: 1、main goroutine,负责初始化参数,拉起负责其它功能的goruntine 2、初始化任务的goruntine 3、分发任务的goruntine 4、统计结果的,当确认各个分块任务都已经完成,则统计结果的goruntine 使用的通信介质: 1、用于传递任务的通道 2、用于传递各个任务结果的通道 3、用于接收各个worker完成任务时的通知的通道 代码: package mai

qq_43684922的博客 951

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Golang避免主协程退出方案

在Golang中编写离线定时任务时,避免主协程退出的核心是(不退出),同时确保定时任务的协程能正常运行。

保持热爱。 428

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

golang批量下载图片并打包zip的性能优化

golang批量下载图片并打包zip的性能优化 关于如何使用golang来打包zip可以先参考 https://blog.youkuaiyun.com/raoxiaoya/article/details/111224599 所以你应该知道,在zip文件里面创建文件是串行的,这是由它的特性决定的。 // Create adds a file to the zip file using the provided name. // It returns a Writer to which the file contents

猛犸象 2402

go开启多个子协程干活、worker

目标 go启动多个协程,每个协程做一个任务,实现并行做任务。 code示例 简单go知识介绍 go的并发通过goroutine来处理; func(){}()是go里的匿名函数,{}后面的()是传参数的。如func(a int){…}(100),传了个参数值100; go func(){}开启1个子协程; for+ go func开启多个子协程; go的sync.WaitGroup控制并发的流程; go func()里+defer捕获子协程内部有发生的panic。因为主进程的defer无法捕获子协程中的pan

元气满满晨 4227

go多线程通信以及控制协程与主线程关闭问题(sync.WaitGroup)

一,需要分配10个协程去接收20个任务,每个协程接收2个任务。 问题1:每个协程通过通道(chan int)接收的任务是否完成,主线程不知道? 问题2:主线程如果执行完了,则在主线程的协程则会自动结束,未接收完的协程则自动被杀掉。 解决方案如下:通过sync.WaitGroup wg.Add(n) :为wg添加 n 个任务, wg.Done() :减掉一个任务 wg.Wait() : 这个用于主线程等待,等到所有任务执行完了。则就会结束。 type Worker struct { ...

weixin_42533856的博客 1245

go+mysql+redis+vue3简单聊室,第4弹:gin的websocket通讯和多go程任务处理

前面我们使用gin的路由实现了常规的http请求,但是聊天是基于websocket的,我们需要建立一个新路由,用于接收websocket请求。websocket的建立是基于http的,一开始需要通过http建立联系,所以我们是可以通过http路由监听到websocket请求的,然后判断请求类型,是websokcet的话,就建立真正的websocket服务gin处理websocket就是用上述方式进行的。修改routes/route.go,如下 在go中,一个http请求就是一个协程,代码执行结束后该协程就结

u012830303的博客 1791

Golang:并发任务处理器

Golang:并发任务处理器。 要求:给定n个task任务的数组tasks,和执行函数excute(),请构造一个函数handle(),并发执行task任务,并且同一时间允许的最大并发调用数为10。

jayLog的博客 612

golang 错误处理channel+error真的香

官方推荐golang中错误处理当做值处理, 既然是值那就可以在channel中传输,本文带你看看golang中channel+error来做异步错误处理有多香,看完本文还会觉得golang的错误处理相比java try catch一点优势都没有吗?

文洲的专栏 3086

Go并发编程原理

我们先来搞懂并发与并行的概念 并发:同一时间做多件事情 并行:同一时间处理多件事情 “做”和“处理”的区别在于:做只是代表即将处理,但是只能选择一个。 比如有a\b两件事情需要做,并发是一个进程在0.02s内,前0.01s做a、后0.01s做b,同一时间只能处理一个事情。并行是两个进程,在前0.01s分别同时做了a和b。 所以单核状况下进程处理只能是并发,只不过cpu切换轮流处理速度太快了,导致你感觉像是并行处理的,其实非也。 Go 语言的协程实现被称之为 goroutine,由 Go 运行时管理,在

鲁花花生油 289

c++ map用法_go channel的高级用法

上篇文章go 协程,我们介绍了go协程以及channel的简单用法,这篇我们详细介绍go channel的一些高级用法。通道选择器select说起channal的高级用法,我们必须先介绍下通道选择器select,它让你同时等待多个通道操作,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。select 随机执行一个可运行的 case。如果没有...

weixin_39877504的博客 295
上一篇: Golang 之 interface接口全面理解
下一篇: Golang 语言的排序、结构体排序
Webben
博客等级 码龄10年 19粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值