Fanout - 更容易得写并发代码

不用管理 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

### 关于 `-location self | parent fanout` 的用法和含义 在硬件描述语言(HDL)设计流程中,尤其是涉及低功耗设计时,`-location` 参数通常用于定义某些逻辑单元或模块的位置关系。以下是对其具体含义的解析: #### `self` 当使用 `-location self` 时,表示该特定对象应位于其自身的上下文中,而不依赖父级或其他关联实体的影响[^1]。这意味着所选的对象不会受到其他层次结构中的设置干扰。 #### `parent` 通过指定 `-location parent`,表明此部分应该依据所属更高层节点(即“父亲”级别)来进行配置或者行为决策。这种设定适用于希望继承上级属性的情况,在分层管理架构里非常常见。 #### `fanout` 而选择 `-location fanout` 则意味着基于扇出网络来决定位置安排。这通常是针对信号传播路径上的多个接收端点考虑优化布局策略的一种方式。它可能涉及到分析连接到同一源的不同目标之间的相互作用,并据此调整物理放置方案以提高性能指标如延迟、功率消耗等。 #### 使用场景对比 - **Self**: 当需要独立处理某个组件而不受外界影响时适用;例如单独测试某子模块功能。 - **Parent**: 如果当前区域的设计参数需参照上一层已有的标准,则采用这种方式更为合适;比如统一控制整个电路板内的工作模式切换机制。 - **Fanout**: 对于那些具有广泛分布特性的资源分配问题(如同步时钟树构建),利用 fanout 可能会带来更好的整体效果因为这样能够考虑到更多实际运行条件下的动态变化因素. ```tcl set_location_assignment PIN_10 -to clk_in -location self set_location_assignment REGION_A -to my_module -location parent set_location_assignment FANOUT_REGION_B -to data_bus -location fanout ``` 以上代码片段展示了如何分别应用这三个不同的定位选项给相应的硬件元件赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值