需要在Go应用程序中异步处理任务? Asynq,简单高效的任务队列实现。
最近发现了一个很好的Go简单高效的异步任务处理库:Asyqn, 开发自谷歌员工。
安装
要安装asynq库和asynqmon命令行工具,请运行以下命令:
go get -u github.com/hibiken/asynq
go get -u github.com/hibiken/asynq/tools/asynqmon
入门
在本asynq教程中,我们将创建两个程序。
producer.go
将创建并定时要由consumer异步处理的任务。
consumer.go
将处理producer创建的任务。
假定在上运行Redis服务器localhost:6379。在开始之前,请确保已安装并运行Redis。
我们需要做的第一件事是创建两个主文件:
mkdir producer consumer
touch producer/producer.go consumer/consumer.go
导入asynq
两个文件:
import "github.com/hibiken/asynq"
Asynq使用Redis作为消息代理。使用一种RedisConnOpt
类型来指定如何连接到Redis。我们这里将使用RedisClientOpt
:
// both in producer.go and consumer.go
var redis = &asynq.RedisClientOpt{
Addr: "localhost:6379",
// Omit if no password is required
Password: "mypassword",
// Use a dedicated db number for asynq.
// By default, Redis offers 16 databases (0..15)
DB: 0,
}
在producer.go
,我们将创建一个Client
实例来创建和定时任务。
在asynq
,要执行的工作单元被封装在称为的结构中Task。其中有两个字段:Type
和Payload
。
// Task represents a task to be performed.
type Task struct {
// Type indicates the type of task to be performed.
Type string
// Payload holds data needed to perform the task.
Payload Payload
}
要创建任务,请使用NewTask
函数,并为任务传递类型和有效负载。
可以通过Client.Schedule
传入任务和需要处理的时间来计划任务。
// producer.go
func main() {
client := asynq.NewClient(redis)
// Create a task with typename and payload.
t1 := asynq.NewTask(
"send_welcome_email",
map[string]interface{
}{
"user_id": 42})
t2 := asynq.NewTask(
"send_reminder_email",
map[string