Golang语言 实现线程池
时间:2022-05-05
本文章向大家介绍Golang语言 实现线程池,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 type GoroutinePool struct {
2 Queue chan func() error
3 Number int
4 Total int
5
6 result chan error
7 finishCallback func()
8 }
9
10 // 初始化
11 func (self *GoroutinePool) Init(number int, total int) {
12 self.Queue = make(chan func() error, total)
13 self.Number = number
14 self.Total = total
15 self.result = make(chan error, total)
16 }
17
18 // 开门接客
19 func (self *GoroutinePool) Start() {
20 // 开启Number个goroutine
21 for i := 0; i < self.Number; i++ {
22 go func() {
23 for {
24 task, ok := <-self.Queue
25 if !ok {
26 break
27 }
28
29 err := task()
30 self.result <- err
31 }
32 }()
33 }
34
35 // 获得每个work的执行结果
36 for j := 0; j < self.Total; j++ {
37 res, ok := <-self.result
38 if !ok {
39 break
40 }
41
42 if res != nil {
43 fmt.Println(res)
44 }
45 }
46
47 // 所有任务都执行完成,回调函数
48 if self.finishCallback != nil {
49 self.finishCallback()
50 }
51 }
52
53 // 关门送客
54 func (self *GoroutinePool) Stop() {
55 close(self.Queue)
56 close(self.result)
57 }
58
59 // 添加任务
60 func (self *GoroutinePool) AddTask(task func() error) {
61 self.Queue <- task
62 }
63
64 // 设置结束回调
65 func (self *GoroutinePool) SetFinishCallback(callback func()) {
66 self.finishCallback = callback
67 }
开启3个线程,下载10个文件的测试代码:
1 func Download_test() {
2 urls := []string{
3 "http://dlsw.baidu.com/sw-search-sp/soft/44/17448/Baidusd_Setup_4.2.0.7666.1436769697.exe",
4 "http://dlsw.baidu.com/sw-search-sp/soft/3a/12350/QQ_V7.4.15197.0_setup.1436951158.exe",
5 "http://dlsw.baidu.com/sw-search-sp/soft/9d/14744/ChromeStandalone_V43.0.2357.134_Setup.1436927123.exe",
6 "http://dlsw.baidu.com/sw-search-sp/soft/6f/15752/iTunes_V12.2.1.16_Setup.1436855012.exe",
7 "http://dlsw.baidu.com/sw-search-sp/soft/70/17456/BaiduAn_Setup_5.0.0.6747.1435912002.exe",
8 "http://dlsw.baidu.com/sw-search-sp/soft/40/12856/QIYImedia_1_06_v4.0.0.32.1437470004.exe",
9 "http://dlsw.baidu.com/sw-search-sp/soft/42/37473/BaiduSoftMgr_Setup_7.0.0.1274.1436770136.exe",
10 "http://dlsw.baidu.com/sw-search-sp/soft/49/16988/YoudaoNote_V4.1.0.300_setup.1429669613.exe",
11 "http://dlsw.baidu.com/sw-search-sp/soft/55/11339/bdbrowserSetup-7.6.100.2089-1212_11000003.1437029629.exe",
12 "http://dlsw.baidu.com/sw-search-sp/soft/53/21734/91zhushoupc_Windows_V5.7.0.1633.1436844901.exe",
13 }
14
15 pool := new(GoroutinePool)
16 pool.Init(3, len(urls))
17
18 for i := range urls {
19 url := urls[i]
20 pool.AddTask(func() error {
21 return download(url)
22 })
23 }
24
25 isFinish := false
26
27 pool.SetFinishCallback(func() {
28 func(isFinish *bool) {
29 *isFinish = true
30 }(&isFinish)
31 })
32
33 pool.Start()
34
35 for !isFinish {
36 time.Sleep(time.Millisecond * 100)
37 }
38
39 pool.Stop()
40 fmt.Println("所有操作已完成!")
41 }
42
43 func download(url string) error {
44 fmt.Println("开始下载... ", url)
45
46 sp := strings.Split(url, "/")
47 filename := sp[len(sp)-1]
48
49 file, err := os.Create("/Users/staff/Documents/Red_Test/AAAA/" + filename)
50 if err != nil {
51 return err
52 }
53
54 res, err := http.Get(url)
55 if err != nil {
56 return err
57 }
58
59 length, err := io.Copy(file, res.Body)
60 if err != nil {
61 return err
62 }
63
64 fmt.Println("## 下载完成! ", url, " 文件长度:", length)
65 return nil
66 }
- 做程序员压力山大,很多人都快疯了
- 小程序让交通出行变得如此简化,看看这些微信小程序你有在用了吗?
- 中小企业如何选择DDoS防御方案?
- “熊医生”出诊正确率超九成 医院:人工智能更多是辅助
- PLC编程优化方法,让程序运行提速!
- 这是硅谷狂人马斯克对未来做出的11个大胆预测,人工智能比核武器更危险
- 在腾讯云上使用自建DNS
- Spring 4.0.2 学习笔记(1) - 最基本的注入
- 关于女神SQLite的疑惑(2)
- WordPress纯代码仿无觅相关文章图文模式功能(增强版)
- 人工智能时代已悄然来临……
- 人民日报发布周鸿祎署名文章:迎接“大安全”时代的新威胁
- Mono 3.2 上跑NUnit测试
- 为WordPress 文章中的链接自动添加 nofollow标签
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python 制作python包,封装成可用模块教程
- 使用python脚本自动生成K8S-YAML的方法示例
- Python虚拟环境库virtualenvwrapper安装及使用
- tp5框架内使用tp3.2分页的方法分析
- YII框架常用技巧总结
- PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
- PHP切割汉字的常用方法实例总结
- Laravel Validator 实现两个或多个字段联合索引唯一
- php实现的顺序线性表示例
- pytorch快速搭建神经网络_Sequential操作
- PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
- Yii框架引入coreseek分页功能示例
- 使用keras内置的模型进行图片预测实例
- PHP convert_cyr_string()函数讲解
- 在keras中model.fit_generator()和model.fit()的区别说明