现在的位置: 首页 > 综合 > 正文

go语言 -并行程序 wordcount

2013年08月11日 ⁄ 综合 ⁄ 共 2192字 ⁄ 字号 评论关闭

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 的方式进行访问

参考:

  1. Go Lang介绍

原始博客地址:http://www.fuxiang90.com/2012/08/go%E8%AF%AD%E8%A8%80-%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F/

抱歉!评论已关闭.