hi,这次介绍一个 go 的异步任务框架 machinery。 和 Python 生态里的 celery 类似。视频里演示了它的简单使用。当我们有一些cpu密集计算任务,延迟任务等, 可以使用异步任务框架提交到别的进程来完成。

go异步任务框架machineryhttps://www.zhihu.com/video/1159110182419099648

示例代码的目录结构如下:

.
├── main.go
├── sendtask.go
└── worker├── tasks.go└── worker.go// main.go 启动 worker
package mainimport "test/machinerydemo/worker"func main() {// 启动异步任务框架taskWorker := worker.NewAsyncTaskWorker(0)taskWorker.Launch()
}//sendtask.go, 测试发送任务
package mainimport ("context""test/machinerydemo/worker"
)func main() {worker.SendHelloWorldTask(context.Background())
}// worker/tasks.go 用来定义任务函数
package workerimport ("context""fmt""github.com/RichardKnop/machinery/v1/tasks"
)var (asyncTaskMap map[string]interface{}
)// 方法名
const (HelloWorldTaskName          = "HelloWorldTask"DeleteAppShareImageTaskName = "DeleteAppShareImageTask"
)// HelloWorld 测试异步任务
func HelloWorld() error {fmt.Println("Hello World!")return nil
}// SendHelloWorldTask 调用点调用此异步任务函数
func SendHelloWorldTask(ctx context.Context) {args := make([]tasks.Arg, 0)task, _ := tasks.NewSignature(HelloWorldTaskName, args)task.RetryCount = 5AsyncTaskCenter.SendTaskWithContext(ctx, task)
}func initAsyncTaskMap() {asyncTaskMap = make(map[string]interface{})asyncTaskMap[HelloWorldTaskName] = HelloWorld
}// worker/worker.go 用来定义后台 worker
package workerimport ("github.com/RichardKnop/machinery/v1"mchConf "github.com/RichardKnop/machinery/v1/config""github.com/RichardKnop/machinery/v1/log""github.com/RichardKnop/machinery/v1/tasks"
)var (AsyncTaskCenter *machinery.Server
)func init() {tc, err := NewTaskCenter()if err != nil {panic(err)}AsyncTaskCenter = tc
}func NewTaskCenter() (*machinery.Server, error) {cnf := &mchConf.Config{Broker:        "redis://localhost:6379",DefaultQueue:  "ServerTasksQueue",ResultBackend: "redis://localhost:6379",}// Create server instanceserver, err := machinery.NewServer(cnf)if err != nil {return nil, err}initAsyncTaskMap()return server, server.RegisterTasks(asyncTaskMap)
}func NewAsyncTaskWorker(concurrency int) *machinery.Worker {consumerTag := "TestWorker"// The second argument is a consumer tag// Ideally, each worker should have a unique tag (worker1, worker2 etc)worker := AsyncTaskCenter.NewWorker(consumerTag, concurrency)// Here we inject some custom code for error handling,// start and end of task hooks, useful for metrics for example.errorhandler := func(err error) {log.ERROR.Println("I am an error handler:", err)}pretaskhandler := func(signature *tasks.Signature) {log.INFO.Println("I am a start of task handler for:", signature.Name)}posttaskhandler := func(signature *tasks.Signature) {log.INFO.Println("I am an end of task handler for:", signature.Name)}worker.SetPostTaskHandler(posttaskhandler)worker.SetErrorHandler(errorhandler)worker.SetPreTaskHandler(pretaskhandler)return worker
}

框架 go_go异步任务框架machinery,嗖嗖的[视频]相关推荐

  1. 异步爬虫框架与协程浅析

    异步爬虫框架与协程浅析 经典原文使用协成完成异步爬虫原文链接 根据分享原文链接. Python基于协程的实现,其实是利用了Python生成器的特性完成的,Python生成器的原理其实涉及到用户态绿色线 ...

  2. Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架

    Sequelize 4.43.0 发布了,Sequelize 是一款基于 Nodejs 的异步 ORM 框架,它同时支持 PostgreSQL.MySQL.SQLite 和 MSSQL 多种数据库,很 ...

  3. android 学习随笔十二(网络:使用异步HttpClient框架)

    使用异步HttpClient框架发送get.post请求 在https://github.com/  搜索 asyn-http https://github.com/search?utf8=✓& ...

  4. celery 停止任务_celery异步任务框架

    目录 Celery 一.官方 二.Celery异步任务框架Celery架构图消息中间件任务执行单元任务结果存储 三.使用场景 四.Celery的安装配置 五.两种celery任务结构:提倡用包管理,结 ...

  5. AsyncQueryHandler 异步查询框架

    AsyncQueryHandler简介: 异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据) 使用场景: 在一般的应用中可以使用ContentProvider去操作数据库 ...

  6. [android] 异步http框架与实现原理

    介绍github上的异步http框架android-async-http loopj开发 获取AsyncHttpClient对象,通过new 调用AsyncHttpClient对象的get(url,r ...

  7. Disruptor是一个高性能的异步处理框架

    为什么80%的码农都做不了架构师?>>>    Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件- ...

  8. Android 从零开始打造异步处理框架

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/52847872 本文出自[赵彦军的博客] 概述 封装尝试 Handler优化 线程优 ...

  9. 三分钟了解 Python3 的异步 Web 框架 FastAPI

    快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...

最新文章

  1. 【日记】一次程序调优发现的同步IO写的问题,切记
  2. springJAR包和配置文件
  3. ast抽象语法树_新抽象语法树(AST)给 PHP7 带来的变化
  4. 使用 Recipe 安装 SAP Commerce Cloud
  5. Maven的pom.xml文件结构之Build配置build
  6. 分享110个采集小偷PHP源码,总有一款适合你
  7. java gbk转机内码_GBK/GB2312编码问题分析以及java获取汉字国标码
  8. python实现京东联盟API接口对接
  9. 轻量级目标检测算法整理
  10. STM32小车篇之超声波测距
  11. Android Studio 个性化主题配置。
  12. 从4G到5G,从物联网到云计算 通信的下一个引爆点在哪里?
  13. 始料未及-- 元宇宙传来好消息,全球轰动
  14. 101shell脚本
  15. Redis使用的21条军规(规范)
  16. 有视频APP上线,一对一交友源码和抖音短视频源码稳步前行
  17. mysql登陆错误2003(hy000)_mysql远程无法登陆出现ERROR 2003 (HY000)...解决方法_MySQL
  18. 职场人生(七):毕业季,回忆大学生活
  19. 地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法
  20. Adversarial Learning for Semi-Supervised Semantic Segmentation(BMVC2018)

热门文章

  1. 《中秋书月》月圆之夜,我和德鲁克
  2. 循环神经网络RNN的基本组件(五)
  3. SpringMVC之访问静态文件
  4. javaweb学习总结(二十六)——jsp简单标签标签库开发(二)
  5. 浅谈地方门户网站运营思路
  6. 无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
  7. WF:要想绑到两个活动的属性值---依赖属性的定义方法
  8. 软件专业毕业生之一个月攻略
  9. Django - 网页加载报错:A server error occurred. Please contact the administrator(亲测)
  10. 解决ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)