基于golang channel实现的轻量级异步任务分发器示例代码

 更新时间:2018年07月02日 16:49:19   作者:honhon  
这篇文章主要给大家介绍了关于基于golang channel实现的轻量级异步任务分发器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

有时候我们为了更好的利用计算机资源,可以把一些耗时长的任务队列化异步执行。举个对应简单的生活中例子就是大多数餐厅里面点菜都是先找地方做,看了菜单选好菜之后找服务员点菜,此时再等待菜做好送上来。这里餐厅厨房就是计算机的底层资源,菜就是待执行的任务,而服务员就是我们的go channel。

关于消息队列有很多好用的框架,如nsq,nats,kafka等等。但有时我们只需要轻量级的异步任务工具,而不需要太过于"复杂"的框架相对于我们的需求来说。于是借鉴一些项目框架,做了一个小小的封装。

项目地址: https://github.com/chenhg5/go...  (本地下载

go-task的使用很简单,只需要初始化一个任务处理器,然后往处理器里面添加任务,然后处理器就会异步地去执行了。

举餐厅的例子,代码如下:

package main

import (
 "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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Golang 如何实现函数的任意类型传参

    Golang 如何实现函数的任意类型传参

    这篇文章主要介绍了Golang 实现函数的任意类型传参操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang trace view视图详解

    golang trace view视图详解

    在golang中可以使用go pprof的工具对golang程序进行性能分析,其中通过go trace 命令生成的trace view视图对于我们分析系统延迟十分有帮助,鉴于当前对trace view视图的介绍还是很少,在粗略的看过trace统计原理后,将对这部分做比较详细的介绍
    2023-08-08
  • 详解go 动态数组 二维动态数组

    详解go 动态数组 二维动态数组

    这篇文章主要介绍了go 动态数组 二维动态数组,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Go 数据结构之二叉树详情

    Go 数据结构之二叉树详情

    这篇文章主要介绍了 Go 数据结构之二叉树详情,二叉树是一种数据结构,在每个节点下面最多存在两个其他节点。即一个节点要么连接至一个、两个节点或不连接其他节点,下文基于GO语言展开二叉树结构详情,需要的朋友可以参考一下
    2022-05-05
  • jenkins构建go及java项目的方法

    jenkins构建go及java项目的方法

    这篇文章主要介绍了jenkins构建go及java项目,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值了,需要的朋友可以参考下
    2021-04-04
  • go语言实现一个最简单的http文件服务器实例

    go语言实现一个最简单的http文件服务器实例

    这篇文章主要介绍了go语言实现一个最简单的http文件服务器的方法,实例分析了Go语言操作http的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Golang结合ip2region实现ip归属地查询

    Golang结合ip2region实现ip归属地查询

    ip2region - 是一个离线IP地址定位库和IP定位数据管理框架,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现,下面我们就来看看Golang如何结合ip2region实现ip归属地查询吧
    2024-03-03
  • 使用Singleflight实现Golang代码优化

    使用Singleflight实现Golang代码优化

    有许多方法可以优化代码以提高效率,减少运行进程就是其中之一,本文我们就来学习一下如何通过使用一个Go包Singleflight来减少重复进程,从而优化Go代码吧
    2023-09-09
  • Golang Mutex互斥锁源码分析

    Golang Mutex互斥锁源码分析

    本篇文章,我们将一起来探究下Golang Mutex底层是如何实现的,知其然,更要知其所以然。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-10-10
  • Golang实现按行读取文件的方法小结

    Golang实现按行读取文件的方法小结

    按行读取文件相较于一次性载入,有着很多优势,如内存效率高、处理速度快、实时性高等,本文主要介绍了Golang按行读取文件的相关方法,希望对大家有所帮助
    2024-02-02

最新评论