Golang语言 -并行程序

go在设计的时候,就有针对并行的语法 —-channel 和goroutine

前者 可以很方便的进行消息和数据传递,在取数据和拿数据的时候可以不用关心底层实现,用  <- 进行赋值

这里必须加time.sleep  不然程序很快就结束,read 和 write 甚至都来不及运行。这里和linux 线程编程很像。现在还不知道有没有更好的方式(貌似看到有人写过 ,用某种方式通知main 结束)

package main

import (

    "fmt"

    "time"

    "math/rand"

)

var ch chan int

func read() {

    for{

        c := <- ch

        fmt.Println("i read ", c)

    }

}

func write(){

    for{

        c := 0

        i := rand.Int()%10

        c += i

        fmt.Println("i write",c)

        ch <- c

    }

}

func main(){

    ch = make(chan int ,4)

    go write()

    go read()

    time.Sleep(1000000)

}

wordcount  代码实现,知道hadoop的都应该知道这个,并行计算,那么在go 里面也很好实现:

main: readfile : 读取文件,进行任务分发 ,分发到三个相同的计算线程 ,只是通过不同的chan来 传递任务(这里的任务就是统计一行字符的每个单词出现的次数)

compute : 计算线程 ,将结果发送到 一个全局的chan中

redeuce : 从全局的chan 中取出结果,合并的最终的结果中 。

感觉自己写的程序还不是很规范,思路很多都局限于之前写C的思路。这里

package main

/*

#include <stdio.h>

*/

import (

    "os"

    "fmt"

    "bufio"

    "time"

    "strings"

    "C"

    "runtime"

)

var str1 chan string

var str2 chan string

var str3 chan string

var keyWordmap chan map[string]int

var result map[string]int

func wordCount(s string) map[string]int {

        m:= make(map[string]int)

        words:=strings.Fields(s)

        for i:=0;i<len(words);i++ {

             m[words[i]] += 1

        }

        return m

}

func compute(num int ){

    for {

        var str string

        if num == 1{

            str = <- str1

        }else if num == 2{

            str = <- str2

        }else if num == 3{

            str =<- str3

        }else {

            return

        }

        m := wordCount(str)

        keyWordmap <- m

        //fmt.Printf("%v#",m)

    }

}

func reduce (){

    for {

        m := <- keyWordMap

        for key,value := range m{

            fmt.Println(key,value)

            result[key] += value

        }

    }

}

func readfile() {

    //var content [100]byte

    fp ,_ := os.Open("wc.txt")

    br := bufio.NewReader(fp)

    defer fp.Close()

    for i:= 1; ; i++ {

        line,err := br.ReadString('\n')

        if err != nil{

            //return -1

            break

        }

        //fmt.Println(line)

        //str1 <- line

        if i %3 == 0{

            str3 <- line

        }else if i % 3 == 1{

            str1 <- line

        }else if i %3 == 2{

            str2 <- line

        }

    }

    /*

    //t.Println(string(content[:]))

    //mystr := string(content[:])

    //array := strings.Split(mystr,"/r/n")

    //fmt.Println(array[:])

    */

}

func main(){

    runtime.GOMAXPROCS(2)

    str1 = make(chan string ,3)

    str2 = make(chan string ,3)

    str3 = make(chan string ,3)

    keyWordmap = make(chan map[string]int ,5)

    result = make(map[string]int)

    time.Sleep(1000000)

    go readfile()

    //time.Sleep(100000000)

    go reduce()

    go compute(1)

    go compute(2)

    go compute(3)

    time.Sleep(10000000000)

    /*

    for{

        time.Sleep(10000000)//10ms

        fmt.Printf("%v#",result)

    }

    */

    defer fmt.Printf("the end result :%v#",result)

}

tips:

  • godoc -http=:8000  运行本地的文档,通过web 的方式进行访问

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-04-09

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏无原型不设计

Mockplus:如何调整图标的大小和方向?

使用属性面板上的大小设置,可以很方便地调节图标大小。 ? 调整方向还是通过属性面板来完成: ? 另外:有些图标调整了大小之后可以用做特别的用途哟,比如 S...

2753
来自专栏vue学习

微信小程序日常踩坑后的总结(猜测你也会遇到,持续更新。。。)

(1)图片需是本地图片或者是路径为https的网络图片; (2)使用网络图片要用wx.downloadFile( )下载,否则真机上无法显示图片; (3)w...

1942
来自专栏Python攻城狮

pycharm快捷键及一些常用设置

1. pycharm默认是自动保存的,习惯自己按ctrl + s 的可以进行如下设置:

983
来自专栏无原型不设计

Mockplus实例之一看就会de五个交互功能

实例来源:豆瓣新加日记(https://www.douban.com/note/create) 先看看豆瓣新加日记的网页: ? 再看看已经制作好的原型预览...

5616
来自专栏Android干货

安卓开发-设置RadioButton的点击效果

3537
来自专栏coding for love

CSS常用布局实现04-三列布局

三列布局应该是非常经典的一个布局,考虑下面这个问题,实现左中右三列,其中左右两列宽度已知为200px,中间宽度自适应。该如何实现?

3782
来自专栏九彩拼盘的叨叨叨

前端学习 第3周 第2天

762
来自专栏Keegan小钢

Android样式的开发:selector篇

上一篇详细讲了shape的用法,讲解了怎么用shape自定义矩形、圆形、线形和环形,以及有哪些需要注意的地方。不过,shape只能定义单一的形状,而实际应用中,...

1973
来自专栏河湾欢儿的专栏

选中分享

941
来自专栏AhDung

【手记】理想的网页列表效果

单纯用ul/ol的list-style-position是搞不掂的,inside是可以让整个列表区块与段落对齐,但会失去项间悬挂对齐效果;outside倒是悬挂...

1362

扫码关注云+社区

领取腾讯云代金券