专栏首页大猪的笔记go笔记:go语言中使用协程异步并行

go笔记:go语言中使用协程异步并行

在go中,有了协程和chan,就能轻松而优雅的实现很多模式。

而引入future的思想可以解放思维。

package utils

import (
    "sync"
    "time"
)

/*
Future 是一个未来的任务的抽象。和python里的那个有点类似。
在异步任务中SetResult,在GetResult的时候会等待result生成,或者超时。
使用姿势:
tasks := make([]*utils.Future, 0)
for i := 0; i < 10; i++ {
    future := utils.NewFuture()
    tasks = append(tasks, future)
    go func(result int) {
        time.Sleep(time.Second * time.Duration(rand.Int63n(10)))
        future.SetResult(result)
    }(i)
}

for _, item := range tasks {
    ret, ok := item.GetResult().(int)
    if ok {
        fmt.Println(ret)
    } else {
        fmt.Println("failed")
    }
}
*/

type Future struct {
    isfinished bool
    result     interface{}
    resultchan chan interface{}
    l          sync.Mutex
}

func (f *Future) GetResult() interface{} {
    f.l.Lock()
    defer f.l.Unlock()
    if f.isfinished {
        return f.result
    }

    select {
    // timeout
    case <-time.Tick(time.Second * 6):
        f.isfinished = true
        f.result = nil
        return nil
    case f.result = <-f.resultchan:
        f.isfinished = true
        return f.result
    }
}

func (f *Future) SetResult(result interface{}) {
    if f.isfinished == true {
        return
    }
    f.resultchan <- result
    close(f.resultchan)
}

func NewFuture() *Future {
    return &Future{
        isfinished: false,
        result:     nil,
        resultchan: make(chan interface{}, 1),
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python笔记:函数式编程求笛卡尔积

    笛卡尔积的本质是把 [1, 1, 1, 3, 3, 3, 5, 5, 5] 和 [2, 4, 6, 2, 4, 6, 2, 4, 6] 上下组合起来。所...

    超级大猪
  • 重构:统一输出

    在项目中,统一返回的入口和出口非常重要。因为你永远没办法知道产品经理下个版本要在返回结果中加什么乱七八糟的东西。

    超级大猪
  • python笔记:生成器表达式,简单查找

    超级大猪
  • ICCV2019 | 任意形状文本检测的像素聚合网络

    本文简要介绍了2019年7月被ICCV录用的论文“Efficient and AccurateArbitrary-Shaped Text Detection w...

    AI科技评论
  • 利用 pyspider 框架抓取猫途鹰酒店信息

    希希里之海
  • Python-matplotlib 学术柱状图绘制

    柱状图或条形图在学术论文中使用的频率还是很大的,图中需要以不同颜色对不同数据进行区分,但当涉及黑白打印时,色彩颜色的区别度较小,导致难以理解,因此需要绘制黑灰颜...

    气象学家
  • [深度数据]·深度学习数据集大全

    小宋是呢
  • 资源 | 这是一份非常全面的开源数据集,你,真的不想要吗?

    机器之心
  • 2017年终总结:秋招心路历程+安卓/java知识总结Android 知识点总结Java知识点总结

    一直想写一篇年终总结的,但是又不知道写点什么,感觉没有什么可总结的,但是今年有很多事情还是值得回顾纪念的,之后再来看这些东西应该会感触颇多。2017对我来说是值...

    牛客网
  • 资源 | 这是一份非常全面的开源数据集,你真的不想要吗?

    昱良

扫码关注云+社区

领取腾讯云代金券