Golang笔记

otium/queue 是go 实现的后台处理任务队列

otium/queue 是go 实现的后台处理任务队列,轻巧,值得推荐。

一个简单的应用场合,用户上传一个头像,要生成8种不同尺寸的缩略图,假设每处理一个缩略图要1秒,如果是单队列则处理完要8秒,如果同时有8个协程处理,则只需要1秒。

下面是简单的otium/queue 示例:

package main

import (
    "fmt"
    "time"

    "github.com/otium/queue"
)

func main() {
    n := 1  // 并发处理数
    t1 := time.Now()
    fmt.Println("Hello, 世界")

    q := queue.NewQueue(func(val interface{}) {
        fmt.Println(val)
        time.Sleep(time.Second * 2)
    }, n)
    for i := 0; i < 20; i++ {
        q.Push(i)
    }
    fmt.Println("Hello, 世界 2")
    q.Wait()
    fmt.Println("Hello, 世界3")
    t2 := time.Now()
    fmt.Println("消耗时间:", t2.Sub(t1), "秒")
}

输出:

Hello, 世界
0
Hello, 世界 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Hello, 世界3
消耗时间: 40.00296549s 秒

把并发处理数 n 改为20 ,输出:

Hello, 世界
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Hello, 世界 2
18
19
Hello, 世界3
消耗时间: 2.000654742s 秒

但这样的并发任务没有传递任务的计算结果,如果需要获得计算结果,就得借助chan 来完成,可以参考《http://www.golangnote.com/topic/70.html 148》的例子。

otium/queue 项目地址 https://github.com/otium/queue 213

另外一个简单的后台任务实现 https://gist.github.com/harlow/dbcd639cf8d396a2ab73 98 (用标准库) 《http://nesv.github.io/golang/2014/02/25/worker-queues-in-go.html 37

另外推荐一个比较复杂的 https://github.com/RichardKnop/machinery 109 基于分布式消息传递的异步任务队列/作业队列。

本文网址: https://golangnote.com/topic/53.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles