goroutine

  1. //go 关键字放在方法调用前新建一个 goroutine 并让他执行方法体
  2. go GetThingDone(param1, param2);
  3. //上例的变种,新建一个匿名方法并执行
  4. go func(param1, param2) {
  5. }(val1, val2)
  6. //直接新建一个 goroutine 并在 goroutine 中执行代码块
  7. go {
  8. //do someting...
  9. }

channel

  1. //resultChan 是一个 int 类型的 channel。类似一个信封,里面放的是 int 类型的值。
  2. var resultChan chan int
  3. //将 123 放到这个信封里面,供别人从信封中取用
  4. resultChan <- 123
  5. //从 resultChan 中取值。这个时候 result := 123
  6. result := <- resultChan

goroutine with channel

  1. /**
  2. * 每次调用方法会新建一个 channel : resultChan,
  3. * 同时新建一个 goroutine 来发起 http 请求并获取结果。
  4. * 获取到结果之后 goroutine 会将结果写入到 resultChan。
  5. */
  6. func UnblockGet(requestUrl string) chan string {
  7. resultChan := make(chan string)
  8. go func() {
  9. request := httplib.Get(requestUrl)
  10. content, err := request.String()
  11. if err != nil {
  12. content = "" + err.Error()
  13. }
  14. resultChan <- content
  15. } ()
  16. return resultChan
  17. }
  18. fmt.Println(time.Now())
  19. resultChan1 := UnblockGet("http://127.0.0.1/test.php?i=1")
  20. resultChan2 := UnblockGet("http://127.0.0.1/test.php?i=2")
  21. fmt.Println(<-resultChan1)
  22. fmt.Println(<-resultChan1)
  23. fmt.Println(time.Now())
  24. // 这个例子只是为了体现 go 和 channel 的用法,有内存泄漏问题,千万不要在线上这么搞。因为新建的 channel 没有 close。下次写一个更高级一点的。

http multi get

  1. type RemoteResult struct {
  2. Url string
  3. Result string
  4. }
  5. func RemoteGet(requestUrl string, resultChan chan RemoteResult) {
  6. request := httplib.NewBeegoRequest(requestUrl, "GET")
  7. request.SetTimeout(2 * time.Second, 5 * time.Second)
  8. //request.String()
  9. content, err := request.String()
  10. if err != nil {
  11. content = "" + err.Error()
  12. }
  13. resultChan <- RemoteResult{Url:requestUrl, Result:content}
  14. }
  15. func MultiGet(urls []string) []RemoteResult {
  16. fmt.Println(time.Now())
  17. resultChan := make(chan RemoteResult, len(urls))
  18. defer close(resultChan)
  19. var result []RemoteResult
  20. //fmt.Println(result)
  21. for _, url := range urls {
  22. go RemoteGet(url, resultChan)
  23. }
  24. for i:= 0; i < len(urls); i++ {
  25. res := <-resultChan
  26. result = append(result, res)
  27. }
  28. fmt.Println(time.Now())
  29. return result
  30. }
  31. func main() {
  32. urls := []string{
  33. "http://127.0.0.1/test.php?i=13",
  34. "http://127.0.0.1/test.php?i=14",
  35. "http://127.0.0.1/test.php?i=15",
  36. "http://127.0.0.1/test.php?i=16",
  37. "http://127.0.0.1/test.php?i=17",
  38. "http://127.0.0.1/test.php?i=18",
  39. "http://127.0.0.1/test.php?i=19",
  40. "http://127.0.0.1/test.php?i=20" }
  41. content := MultiGet(urls)
  42. fmt.Println(content)
  43. }
ft_authoradmin  ft_create_time2017-09-07 12:09
 ft_update_time2017-10-29 14:42