2019-12-01 01:38:46 +08:00
|
|
|
# Asynq [![Build Status](https://travis-ci.com/hibiken/asynq.svg?token=paqzfpSkF4p23s5Ux39b&branch=master)](https://travis-ci.com/hibiken/asynq)
|
|
|
|
|
|
|
|
Asynq is a simple asynchronous task queue library in Go.
|
|
|
|
|
|
|
|
## Requirements
|
|
|
|
|
|
|
|
- Redis: 2.6+
|
|
|
|
- Go: 1.12+
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
```
|
|
|
|
go get -u github.com/hibiken/asynq
|
|
|
|
```
|
|
|
|
|
|
|
|
## Getting Started
|
|
|
|
|
|
|
|
1. Import `asynq` in your file.
|
|
|
|
|
|
|
|
```go
|
|
|
|
import "github.com/hibiken/asynq"
|
|
|
|
```
|
|
|
|
|
|
|
|
2. Create a `Client` instance to create tasks.
|
|
|
|
|
|
|
|
```go
|
|
|
|
func main() {
|
|
|
|
client := asynq.NewClient(&asynq.RedisOpt{
|
|
|
|
Addr: "localhost:6379",
|
|
|
|
})
|
|
|
|
|
|
|
|
t1 := &asynq.Task{
|
|
|
|
Type: "send_welcome_email",
|
2019-12-02 11:03:31 +08:00
|
|
|
Payload: map[string]interface{}{
|
2019-12-01 01:38:46 +08:00
|
|
|
"recipient_id": 1234,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
t2 := &asynq.Task{
|
|
|
|
Type: "send_reminder_email",
|
2019-12-02 11:03:31 +08:00
|
|
|
Payload: map[string]interface{}{
|
2019-12-01 01:38:46 +08:00
|
|
|
"recipient_id": 1234,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2019-12-02 11:03:31 +08:00
|
|
|
// process the task immediately.
|
2019-12-01 01:38:46 +08:00
|
|
|
client.Process(t1, time.Now())
|
|
|
|
|
2019-12-02 11:03:31 +08:00
|
|
|
// process the task 24 hours later.
|
2019-12-01 01:38:46 +08:00
|
|
|
client.Process(t2, time.Now().Add(24 * time.Hour))
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
3. Create a `Background` instance to process tasks.
|
|
|
|
|
|
|
|
```go
|
|
|
|
func main() {
|
|
|
|
bg := asynq.NewBackground(10, &asynq.RedisOpt{
|
|
|
|
Addr: "localhost:6379",
|
|
|
|
})
|
|
|
|
|
2019-12-03 12:42:21 +08:00
|
|
|
bg.Run(asynq.HandlerFunc(handler))
|
2019-12-01 01:38:46 +08:00
|
|
|
}
|
|
|
|
|
2019-12-02 11:03:31 +08:00
|
|
|
// if handler returns an error or panics, the task will be retried after some delay.
|
2019-12-08 00:47:17 +08:00
|
|
|
func handler(t *asynq.Task) error {
|
2019-12-01 01:38:46 +08:00
|
|
|
switch t.Type {
|
|
|
|
case "send_welcome_email":
|
2019-12-19 23:13:43 +08:00
|
|
|
id, err := t.Payload.GetInt("recipient_id")
|
|
|
|
if err != nil{
|
|
|
|
return err
|
2019-12-01 01:38:46 +08:00
|
|
|
}
|
2019-12-19 23:13:43 +08:00
|
|
|
fmt.Printf("Send Welcome Email to %d\n", id)
|
2019-12-01 01:38:46 +08:00
|
|
|
|
|
|
|
// ... handle other task types.
|
|
|
|
|
|
|
|
default:
|
|
|
|
return fmt.Errorf("unexpected task type: %s", t.Type)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
```
|