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"}
}
}
相关推荐
从零开发区块链应用(十)--golang协程使用
文章目录一、什么是并发1.1 并发定义1.2 并发的好处二、什么是协程2.1 协程定义2.2 协程的优点三、golang协程实践 一、什么是并发 1.1 并发定义 为了更有意思的解释这个概念,我借用知乎上的一个回答:你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你
golang中多协程处理
此代码使用了一个无缓冲通道,并且在一个单独的 goroutine 中等待所有协程完成后关闭通道。或者,也可以根据实际情况选择一个较大的固定容量作为缓冲通道的容量,以提高性能,但要确保这个容量足够大以避免阻塞。有一个新的 goroutine 开始执行任务,并且在这个 goroutine 完成任务后,需要等待一个计数的减少。这段代码的目的是对一个包含整数的切片进行并发处理,将每个整数乘以 2,并将处理后的结果收集到一个结果切片中。的计数变为零,表示所有被跟踪的 goroutine 都已完成任务。
平头哥面试——芯片工程师面经
有5个成递增关系的32bit地址值,彼此之间的间隔大小不确定,可以把他们当成parameter来输入模块,现有一个32bit输入数据,要求用尽量少资源去的判断这个数处于哪2个地址之间(地址区间),并且输出区间号。a)后续大概会在9月下旬谈具体的薪资,他们现在也没想好今年应届生的薪资该给多少,到时候如果可以签三方的话可能会跳过意向书环节直接发offer,谈薪资肯定是通过电话来。b. 这边的CPU是自己研制的(玄铁),成都这边主要做存储和网络,都有SOC。a. 成都这边的网络部门具体做的业务有哪些?
go golang 链式开启多协程处理数据 并发
一、大体思路 把所有要处理的方法放在同一个切片当中,然后循环去开启多个协程处理这些方法 二、具体做法 1.定义两个结构体 用来存储要处理的方法和存储它下一个要多协程处理的方法,主要目的是要链式的连接下去 //定义一个接口 起到一个连接作用 type job interface { doItJob() error } //多个协程一次做的事情 并且实现job这个接口 type JustDoIt struct { fn []func() //多协程要处理的方法 nextFunc job
【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)
认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。
【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】
attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!
golang多协程
golang代码。
电磁阀颤振工作原理
颤振 颤振,弹性结构在均匀气(或液)流中受到空气(或液体)动力、弹性力和惯性力(见达朗伯原理)的耦合作用而发生的大幅度振动,它是气动弹性力学中最重要的问题之一。 随着机电液一体化技术的发展,电液比例控制技术的应用越来越广泛。电液比例控制系统范围较广,在液压传动与控制过程中,系统能够接受模拟信号或数字信号,使输出的流量或压力连续成比例地变化,都属于此类。该控制系统的优点是充分利用了液压控制与电气控制的长处,即功率传递靠液压,信号处理靠电气的优化措施。 电液比例控制原理与要求 液压控制系统中两个最重要的被控参数
Golang协程详解
golang 协程引入,原理讲解,GMP调度模型详解,调度器讲解与流程分析
【施磊】C++课程笔记目录
【C++编程】施磊老师C++笔记目录
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
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:虽然是两个携程同时在
【100%通过率】2023华为od机试C卷【电脑病毒感染】Java&Go 实现
一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.
go多协程查mysql_一种 golang 实现 多协程任务处理的套路
# 一种 golang 实现 多协程任务处理的套路## 那么是什么样的任务呢,一般是在生产者-消费者模式的消费者进程 ,举几个例子1. 消费kafka 数据2. 消费redis 数据3. 轮询处理数据库数据4. ...## 下面来分析一下1. 业务逻辑处理协程到底多少个呢 ?处理一个数据 就 go 一个吗,也可以不过有点粗暴,协程也不是越多越好,调度也是要好性能的所以还是控制一下,一般吧 弄个c...
【QT开发教程】Qt中的数据加密与解密
在现代应用程序中,数据加密与解密是保护敏感信息的重要手段。Qt本身并不直接提供数据加密与解密的支持,但可以使用第三方库,如OpenSSL或Crypto++,来实现这一功能。本文将介绍如何在Qt中使用OpenSSL进行数据加密与解密,包括基本概念、使用方法以及一些实际的示例。
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
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
Golang避免主协程退出方案
在Golang中编写离线定时任务时,避免主协程退出的核心是(不退出),同时确保定时任务的协程能正常运行。
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
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
go多线程通信以及控制协程与主线程关闭问题(sync.WaitGroup)
一,需要分配10个协程去接收20个任务,每个协程接收2个任务。 问题1:每个协程通过通道(chan int)接收的任务是否完成,主线程不知道? 问题2:主线程如果执行完了,则在主线程的协程则会自动结束,未接收完的协程则自动被杀掉。 解决方案如下:通过sync.WaitGroup wg.Add(n) :为wg添加 n 个任务, wg.Done() :减掉一个任务 wg.Wait() : 这个用于主线程等待,等到所有任务执行完了。则就会结束。 type Worker struct { ...
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请求就是一个协程,代码执行结束后该协程就结
Golang:并发任务处理器
Golang:并发任务处理器。 要求:给定n个task任务的数组tasks,和执行函数excute(),请构造一个函数handle(),并发执行task任务,并且同一时间允许的最大并发调用数为10。
golang 错误处理channel+error真的香
官方推荐golang中错误处理当做值处理, 既然是值那就可以在channel中传输,本文带你看看golang中channel+error来做异步错误处理有多香,看完本文还会觉得golang的错误处理相比java try catch一点优势都没有吗?
Go并发编程原理
我们先来搞懂并发与并行的概念 并发:同一时间做多件事情 并行:同一时间处理多件事情 “做”和“处理”的区别在于:做只是代表即将处理,但是只能选择一个。 比如有a\b两件事情需要做,并发是一个进程在0.02s内,前0.01s做a、后0.01s做b,同一时间只能处理一个事情。并行是两个进程,在前0.01s分别同时做了a和b。 所以单核状况下进程处理只能是并发,只不过cpu切换轮流处理速度太快了,导致你感觉像是并行处理的,其实非也。 Go 语言的协程实现被称之为 goroutine,由 Go 运行时管理,在
c++ map用法_go channel的高级用法
上篇文章go 协程,我们介绍了go协程以及channel的简单用法,这篇我们详细介绍go channel的一些高级用法。通道选择器select说起channal的高级用法,我们必须先介绍下通道选择器select,它让你同时等待多个通道操作,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。select 随机执行一个可运行的 case。如果没有...
1337



被折叠的 条评论
为什么被折叠?



