Fanout - 更容易得写并发代码

Fanout是一个Golang包,旨在简化并发程序(goroutine和channel)的编写,减少死锁问题。它源于Go Concurrency Patterns: Pipelines博客的示例。通过使用Fanout,开发者可以更轻松地管理并发任务,如并发执行60个whois查询来检查域名状态,避免复杂的grouting和channel管理。
摘要由CSDN通过智能技术生成

不用管理 grouting 和 channel 了。 以下为转发 golangtc.com 原文:


刚刚写了个包,觉得值得出来分享下:

文档: https://github.com/sunfmin/fanout

用来简化并发程序(goroutine, channel)的编写,这个包直接改写自Go Concurrency Patterns: Pipelines博客的最后一个样例程序。

平时写带goroutine和channel的程序,总是时不时的爆"fatal error: all goroutines are asleep - deadlock!",检查起来又很难找原因。

例子程序 - 用60个goroutine一起跑whois来查看域名是不是还在:

inputs := []interface{}{}


for _, word:= range domainWords {
    inputs = append(inputs, word)
}

results, err2 := fanout.ParallelRun(60, func(input interface{})
(interface{}, error) {
    word := input.(string)
    if strings.TrimSpace(word) == "" {
        return nil, nil
    }

    py := pinyin.Convert(word)
    pydowncase := strings.ToLower(py)
    domain := pydowncase + ".com"
    outr, err := domainAvailable(word, domain)

    if outr.available {
        fmt.Printf("[Ohh Yeah] %s %s\n", outr.word, outr.domain)
    } else {
        fmt.Printf("\t\t\t %s %s %s\n", outr.word, outr.domain, outr.summary)
    }

    if err != nil {
        fmt.Println("Error: ", err)
    }

    return outr, nil
}, inputs)

fmt.Println("Finished ", len(results), ", Error:", err2)

一图来说明:

sunfmin_fanout.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值