多核处理器越来越普及。有没有一种简单的办法,能够让我们写的软件释放多核的威力?是有的。随着Golang, Erlang, Scala等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一个好的编程模式有一个极其简洁的内核,还有在此之上丰富的外延。可以解决现实世界中各种各样的问题。
她的logo~
Go语言的一个很大的优势就是内置了goroutine机制,使得开发者可以方便地编写并发程序。
go的web编程里,也出现了一个web框架 https://github.com/astaxie/beego
有朋友用过,感觉不错。。。
安装 ,大家要是安装不了,就下载源码编译,看readme 。。。。
easy_install mercurial
or yum install mercurial
hg clone -r release https://go.googlecode.com/hg/ go
cd go/src ./all.bash
#打开/etc/profile在最后添加下面两行
export GOROOT=/usr/local/go
export PATH=GOROOT/bin:$PATH
先来一个小demo 哈~
一个简单的http~ 简单的输出print
package main import ( "fmt" "net/http" "strings" "log" ) func sayhelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) fmt.Println(r.Form["url_long"]) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, "")) } fmt.Fprintf(w, "这里是峰云的测试页面哈~!") //这个写入到w的是输出到客户端的 fmt.Fprintf(w, "\n") //这个写入到w的是输出到客户端的 } func main() { http.HandleFunc("/", sayhelloName) //设置访问的路由 err := http.ListenAndServe("0.0.0.0:9090", nil) //设置监听的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } }
这里介绍一个老外写的web框架
写的风格很像web.py flask 。 喜欢这样的东东。
package main import ( "github.com/hoisie/web" ) func hello(ctx *web.Context, val string) { for k,v := range ctx.Params { println(k, v) } } func main() { web.Get("/(.*)", hello) web.Run("0.0.0.0:9999") }
让我们简单的测试下~
客户端:
服务端:
看起来是没有问题,当然用for curl的方法测试,确实有点搓。。。
我们用ab测试下~
源地址 http://rfyiamcool.blog.51cto.com/1030776/1285325
用了 2.1秒左右~ 这个还是单核的vm
我们来深入一下这个框架的功能~
提交后的结果~
这里分享一个go调用外部命令的代码~
package main import ( "fmt" "io/ioutil" "os/exec" ) func main() { cmd := exec.Command("/bin/sh", "-c", `ps aux`) stdout, err := cmd.StdoutPipe() if err != nil { fmt.Println("StdoutPipe: " + err.Error()) return } stderr, err := cmd.StderrPipe() if err != nil { fmt.Println("StderrPipe: ", err.Error()) return } if err := cmd.Start(); err != nil { fmt.Println("Start: ", err.Error()) return } bytesErr, err := ioutil.ReadAll(stderr) if err != nil { fmt.Println("ReadAll stderr: ", err.Error()) return } if len(bytesErr) != 0 { fmt.Printf("stderr is not nil: %s", bytesErr) return } bytes, err := ioutil.ReadAll(stdout) if err != nil { fmt.Println("ReadAll stdout: ", err.Error()) return } if err := cmd.Wait(); err != nil { fmt.Println("Wait: ", err.Error()) return } fmt.Printf("stdout: %s", bytes) }
大家都会懂的哦~ 和python一样也是调用os模块来执行命令。
大家可以在页面上接收参数,用os模块来执行外部的命令。
完事了,先这么招吧。
今天有点忙,等我把一个需求解决了后,然后咱们继续搞~