goroutine
//go 关键字放在方法调用前新建一个 goroutine 并让他执行方法体
go GetThingDone(param1, param2);
//上例的变种,新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
//do someting...
}
channel
//resultChan 是一个 int 类型的 channel。类似一个信封,里面放的是 int 类型的值。
var resultChan chan int
//将 123 放到这个信封里面,供别人从信封中取用
resultChan <- 123
//从 resultChan 中取值。这个时候 result := 123
result := <- resultChan
goroutine with channel
/**
* 每次调用方法会新建一个 channel : resultChan,
* 同时新建一个 goroutine 来发起 http 请求并获取结果。
* 获取到结果之后 goroutine 会将结果写入到 resultChan。
*/
func UnblockGet(requestUrl string) chan string {
resultChan := make(chan string)
go func() {
request := httplib.Get(requestUrl)
content, err := request.String()
if err != nil {
content = "" + err.Error()
}
resultChan <- content
} ()
return resultChan
}
fmt.Println(time.Now())
resultChan1 := UnblockGet("http://127.0.0.1/test.php?i=1")
resultChan2 := UnblockGet("http://127.0.0.1/test.php?i=2")
fmt.Println(<-resultChan1)
fmt.Println(<-resultChan1)
fmt.Println(time.Now())
// 这个例子只是为了体现 go 和 channel 的用法,有内存泄漏问题,千万不要在线上这么搞。因为新建的 channel 没有 close。下次写一个更高级一点的。
http multi get
type RemoteResult struct {
Url string
Result string
}
func RemoteGet(requestUrl string, resultChan chan RemoteResult) {
request := httplib.NewBeegoRequest(requestUrl, "GET")
request.SetTimeout(2 * time.Second, 5 * time.Second)
//request.String()
content, err := request.String()
if err != nil {
content = "" + err.Error()
}
resultChan <- RemoteResult{Url:requestUrl, Result:content}
}
func MultiGet(urls []string) []RemoteResult {
fmt.Println(time.Now())
resultChan := make(chan RemoteResult, len(urls))
defer close(resultChan)
var result []RemoteResult
//fmt.Println(result)
for _, url := range urls {
go RemoteGet(url, resultChan)
}
for i:= 0; i < len(urls); i++ {
res := <-resultChan
result = append(result, res)
}
fmt.Println(time.Now())
return result
}
func main() {
urls := []string{
"http://127.0.0.1/test.php?i=13",
"http://127.0.0.1/test.php?i=14",
"http://127.0.0.1/test.php?i=15",
"http://127.0.0.1/test.php?i=16",
"http://127.0.0.1/test.php?i=17",
"http://127.0.0.1/test.php?i=18",
"http://127.0.0.1/test.php?i=19",
"http://127.0.0.1/test.php?i=20" }
content := MultiGet(urls)
fmt.Println(content)
}
ft_authoradmin ft_create_time2017-09-07 12:09
ft_update_time2017-10-29 14:42
ft_update_time2017-10-29 14:42