Asynq 实现Go后台作业异步定时任务处理类似Celery/Sidekiq

Asynq是一个由谷歌员工开发的Go语言库,用于实现简单高效的异步任务队列。本文介绍了如何安装、入门以及使用Asynq进行任务调度,包括创建任务、处理任务和使用命令行工具asynqmon监控任务状态。示例中展示了如何连接Redis,创建任务生产者和消费者,以及如何处理不同类型的Task。
摘要由CSDN通过智能技术生成

需要在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。其中有两个字段:TypePayload

// 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
Machinery 是一个 Go 语言的异步任务队列和作业队列,基于分布式消息传递。类似 Python 的 Celery 框架。Machinery 中的任务(或者作业)可通过多个 worker 在很多服务器上并发的执行,或者可在单个服务器上利用 Go 的协程运行多个 worker 进程。任务的定义:type AddTask struct{} func (t AddTask) Run(args []interface{}) (interface{}, error) {     parsedArgs, err := machinery.ParseNumberArgs(args)     if err != nil {         return nil, err     }     add := func(args []float64) float64 {         sum := 0.0         for _, arg := range args {             sum  = arg         }         return sum     }     return add(parsedArgs), nil } type MultiplyTask struct{} func (t MultiplyTask) Run(args []interface{}) (interface{}, error) {     parsedArgs, err := machinery.ParseNumberArgs(args)     if err != nil {         return nil, err     }     multiply := func(args []float64) float64 {         sum := 1.0         for _, arg := range args {             sum *= arg         }         return sum     }     return multiply(parsedArgs), nil } // ... more tasks任务注册:tasks := map[string]machinery.Task{     "add":      AddTask{},     "multiply": MultiplyTask{}, } app.RegisterTasks(tasks) 标签:GoMachinery
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值