基于golang channel实现的轻量级异步任务分发器示例代码
Go  /  管理员 发布于 6年前   105
前言
有时候我们为了更好的利用计算机资源,可以把一些耗时长的任务队列化异步执行。举个对应简单的生活中例子就是大多数餐厅里面点菜都是先找地方做,看了菜单选好菜之后找服务员点菜,此时再等待菜做好送上来。这里餐厅厨房就是计算机的底层资源,菜就是待执行的任务,而服务员就是我们的go channel。
关于消息队列有很多好用的框架,如nsq,nats,kafka等等。但有时我们只需要轻量级的异步任务工具,而不需要太过于"复杂"的框架相对于我们的需求来说。于是借鉴一些项目框架,做了一个小小的封装。
项目地址: https://github.com/chenhg5/go... (本地下载)
go-task的使用很简单,只需要初始化一个任务处理器,然后往处理器里面添加任务,然后处理器就会异步地去执行了。
举餐厅的例子,代码如下:
package mainimport ( "runtime" "fmt" "time" "github.com/chenhg5/go-task")func main() { // init task.InitTaskReceiver(runtime.NumCPU()) // 有十个人同时点菜 for i := 0; i < 10; i++ { task.AddTask(task.NewTask( map[string]interface{}{ "paramA" : "value", }, // 参数 []task.FacFunc{ordering, cooking, deliverying}, // 任务列表 -1), // -1代表任务不超时 ) } time.Sleep(time.Second * 50)}// 下单任务func ordering(uuid string, param map[string]interface{}) (string, error) { fmt.Println("i am ordering") time.Sleep(time.Second * 1) return uuid, nil}// 做菜任务func cooking(uuid string, param map[string]interface{}) (string, error) { fmt.Println("i am cooking") time.Sleep(time.Second * 1) return uuid, nil}// 配送任务func deliverying(uuid string, param map[string]interface{}) (string, error) { fmt.Println("i am deliverying") time.Sleep(time.Second * 1) return uuid, nil}
跑一遍,就会看到:
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am ordering
i am ordering
i am cooking
i am cooking
i am deliverying
i am deliverying
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对AIDI的支持。
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号