刚才和以前同学,聊到云服务器,分布式计算的问题。
现在他用的hadoop的mapreduce。说实话hadoop的大名我的确有所耳闻。
但可能处于某种偏执,我还是认为go语言是分布式,云计算的最佳选择。
一个go语言分布式计算的雏形:可以用于理解chan,gorutinue,for,select的基础用法
/**
* Created by Administrator on 13-12-10.
*/
package main
import (
"fmt"
)
// 求1 + 2 + 3 + ... 10000
func main() {
// 传统算法
result := 0
for i := 1; i <= 10000; i++ {
result += i
}
fmt.Println(result)
// 分布式计算雏形
c1, c2, c3, c4, c5 := make(chan int), make(chan int), make(chan int), make(chan int), make(chan int)
defer close(c1)
defer close(c2)
defer close(c3)
defer close(c4)
defer close(c5)
go func() {
r := 0
for i := 1; i <= 2000; i++ {
r += i
}
c1 <- r
}()
go func() {
r := 0
for i := 2001; i <= 4000; i++ {
r += i
}
c2 <- r
}()
go func() {
r := 0
for i := 4001; i <= 6000; i++ {
r += i
}
c3 <- r
}()
go func() {
r := 0
for i := 6001; i <= 8000; i++ {
r += i
}
c4 <- r
}()
go func() {
r := 0
for i := 8001; i <= 10000; i++ {
r += i
}
c5 <- r
}()
var r1, r2, r3, r4, r5 int
// 阻塞式等待结果
// r1 = <-c1
// r2 = <-c2
// r3 = <-c3
// r4 = <-c4
// r5 = <-c5
// 非阻塞等待结果
for {
select {
case r1 = <-c1:
fmt.Println("r1计算完毕:", r1)
case r2 = <-c2:
fmt.Println("r2计算完毕:", r2)
case r3 = <-c3:
fmt.Println("r3计算完毕:", r3)
case r4 = <-c4:
fmt.Println("r4计算完毕:", r4)
case r5 = <-c5:
fmt.Println("r5计算完毕:", r5)
default:
}
if r1 != 0 && r2 != 0 && r3 != 0 && r4 != 0 && r5 != 0 {
break
}
}
result = r1+r2+r3+r4+r5
fmt.Println(result)
}
r2计算完毕: 6001000
r3计算完毕: 10001000
r5计算完毕: 18001000
r4计算完毕: 14001000
r1计算完毕: 2001000
50005000