golang并发编程

http://blog.csdn.net/e421083458/article/details/49739043

golang普通方法:

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5. )  
  6.   
  7. func rand_generator_1() int {  
  8.     return rand.Int()  
  9. }  
  10.   
  11. func main() {  
  12.     fmt.Println(rand_generator_1())  
  13. }  


golang生成器:

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "math/rand"  
  6. )  
  7.   
  8. /**  
  9. * 生成器  
  10. * 根据已知权限使用函数生成相应数据,异步调用节省了大量时间。  
  11. * @author: niuyufu  
  12.  */  
  13.   
  14. func rand_generator_1() int {  
  15.     return rand.Int()  
  16. }  
  17.   
  18. //直接返回通道channel  
  19. func rand_generator_2() chan int {  
  20.     //创建通道  
  21.     out := make(chan int)  
  22.     //创建携程  
  23.     go func() {  
  24.         //持续执行,直到程序被打断  
  25.         for {  
  26.             //向通道内写入数据,如果无人读取会等待  
  27.             out <- rand.Int()  
  28.         }  
  29.     }()  
  30.     return out  
  31. }  
  32.   
  33. func main() {  
  34.     //生成随机数作为一个服务  
  35.     rand_service_handler := rand_generator_2()  
  36.     //从服务中读取随机数并打印  
  37.     fmt.Println("%dn", <-rand_service_handler)  
  38.     fmt.Println("%dn", <-rand_service_handler)  
  39.     fmt.Println("%dn", <-rand_service_handler)  
  40. }  


golang多路复用,高并发版生成器:

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "math/rand"  
  6. )  
  7.   
  8. /**  
  9. * 多路复用,高并发版生成器  
  10. * 根据已知权限使用函数生成相应数据,异步调用节省了大量时间。  
  11. * @author: niuyufu  
  12.  */  
  13.   
  14. func rand_generator_1() int {  
  15.     return rand.Int()  
  16. }  
  17.   
  18. //直接返回通道channel  
  19. func rand_generator_2() chan int {  
  20.     //创建通道  
  21.     out := make(chan int)  
  22.     //创建携程  
  23.     go func() {  
  24.         //持续执行,直到程序被打断  
  25.         for {  
  26.             //向通道内写入数据,如果无人读取会等待  
  27.             out <- rand.Int()  
  28.         }  
  29.     }()  
  30.     return out  
  31. }  
  32.   
  33. //函数 rand_generator_3,返回通道(channel)  
  34. func rand_generator_3() chan int {  
  35.     //创建两个随机数生成器服务  
  36.     rand_service_handler_1 := rand_generator_2()  
  37.     rand_service_handler_2 := rand_generator_2()  
  38.     //创建通道  
  39.     out := make(chan int)  
  40.     //创建协程  
  41.     go func() {  
  42.         for {  
  43.             //读取生成器1中的数据,整合  
  44.             out <- <-rand_service_handler_1  
  45.         }  
  46.     }()  
  47.     go func() {  
  48.         for {  
  49.             //读取生成器1中的数据,整合  
  50.             out <- <-rand_service_handler_2  
  51.         }  
  52.     }()  
  53.     return out  
  54. }  
  55. func main() {  
  56.     //生成随机数作为一个服务  
  57.     rand_service_handler := rand_generator_3()  
  58.     //从服务中读取随机数并打印  
  59.     fmt.Println("%dn", <-rand_service_handler)  
  60.     fmt.Println("%dn", <-rand_service_handler)  
  61.     fmt.Println("%dn", <-rand_service_handler)  
  62. }  


golang之Furture技术

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5. )  
  6.   
  7. /**  
  8. * Furture技术  
  9. * 在不准备好参数的情况下调用函数:这样的设计可以提供很大的自由度和并发度, 参数调用与参数调用完全解耦  
  10. * @author: niuyufu  
  11.  */  
  12.   
  13. //一个查询结构体  
  14. type query struct {  
  15.     //参数channel  
  16.     sql chan string  
  17.     //结果channel  
  18.     result chan string  
  19. }  
  20.   
  21. //执行query  
  22. func execQuery(q query) {  
  23.     //启动协程  
  24.     go func() {  
  25.         //获取输入  
  26.         sql := <-q.sql  
  27.         //访问数据库,输出结果通道  
  28.         q.result <- "get " + sql  
  29.     }()  
  30. }  
  31. func main() {  
  32.     //初始化Query  
  33.     q := query{make(chan string, 1), make(chan string, 1)}  
  34.     //执行Query,注意执行的时候无需准备参数  
  35.     execQuery(q)  
  36.   
  37.     //准备参数  
  38.     q.sql <- "select * from table"  
  39.     //获取结果  
  40.     fmt.Println(<-q.result)  
  41. }  


golang之并发循环

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5. )  
  6.   
  7. /**  
  8. * 并发循环  
  9. * 并发一次性跑完N个任务,这个牛X  
  10. * @author: niuyufu  
  11.  */  
  12. func doSomething(i int, xi int) {  
  13.     fmt.Println("i=%d,xi=%d", i, xi)  
  14. }  
  15.   
  16. func main() {  
  17.     //建立计数器  
  18.     //这里就好比有好多一次性需要处理完的任务  
  19.     data := []int{1, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3}  
  20.     N := len(data)  
  21.     sem := make(chan int, N)  
  22.     //经过这个for可以让cpu占满来跑你的任务  
  23.     for i, xi := range data {  
  24.         //建立协程  
  25.         go func(i int, xi int) {  
  26.             doSomething(i, xi)  
  27.             //计数  
  28.             sem <- 0  
  29.         }(i, xi)  
  30.     }  
  31.     fmt.Println("并发循环开始")  
  32.     //等待结束,查看跑完结果  
  33.     for i := 0; i < N; i++ {  
  34.         <-sem  
  35.     }  
  36.     fmt.Println("搞定了。")  
  37. }  


golang之Chain Filter技术

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5. )  
  6.   
  7. /**  
  8. * Chain Filter技术  
  9. * 并发过滤链,每个通道只有两个协程访问,性能良好  
  10. * @author: niuyufu  
  11.  */  
  12. func Generate(ch chan<- int) {  
  13.     for i := 2; ; i++ {  
  14.         //fmt.Println("Generate:i:", i)  
  15.         ch <- i  
  16.     }  
  17. }  
  18. func Filter(in <-chan int, out chan<- int, prime int) {  
  19.     for {  
  20.         //只有输出才能再创建  
  21.         i := <-in  
  22.         //fmt.Println("Filter:in pop:", i)  
  23.         if i%prime != 0 {  
  24.             //fmt.Println("Filter:out add:", i)  
  25.             out <- i  
  26.         }  
  27.     }  
  28. }  
  29.   
  30. //  
  31. func main() {  
  32.     //result数组  
  33.     var numbers []int  
  34.     //channel大小为1  
  35.     ch := make(chan int)  
  36.     go Generate(ch) //generate的gorouine占用channel:ch,通道被占用一次  
  37.     for i := 0; i < 1000; i++ {  
  38.         prime := <-ch  
  39.         numbers = append(numbers, prime)  
  40.         fmt.Println(prime, "n")  
  41.         ch1 := make(chan int)  
  42.         go Filter(ch, ch1, prime) //Filter的gorouine也点用了channel:ch,通道被占用二次  
  43.         ch = ch1                  //打通两个通道  
  44.         //fmt.Println(<-ch1)  
  45.     }  
  46.     //fmt.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)  
  47. }  


golang之共享变量

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "time"  
  6. )  
  7.   
  8. /**  
  9. * 共享变量  
  10. * 通过一个单独的协程来维护这两个通道。保证数据的一致性。  
  11. * @author: niuyufu  
  12.  */  
  13. //共享变量有一个读通道和一个写通道组成  
  14. type sharded_var struct {  
  15.     reader chan int  
  16.     writer chan int  
  17. }  
  18.   
  19. //共享变量维护协程  
  20. func sharded_var_whachdog(v sharded_var) {  
  21.     go func() {  
  22.         //初始值  
  23.         var value int = 0  
  24.         for {  
  25.             //监听读写通道,完成服务  
  26.             select {  
  27.             case value = <-v.writer:  
  28.             case v.reader <- value:  
  29.             }  
  30.         }  
  31.     }()  
  32. }  
  33.   
  34. //超时避免阻塞  
  35. func never_leak(ch chan int) {  
  36.     //初始化timeout,缓冲为1  
  37.     timeout := make(chan bool, 1)  
  38.     //启动timeout协程,由于缓存为1,不可能泄漏  
  39.     go func() {  
  40.         time.Sleep(1 * time.Second)  
  41.         timeout <- true  
  42.     }()  
  43.     //监听通道,由于设有超时,不可能泄漏  
  44.     select {  
  45.     case <-ch:  
  46.         // a read from ch has occurred  
  47.     case <-timeout:  
  48.         // the read from ch has timed out  
  49.     }  
  50. }  
  51.   
  52. func main() {  
  53.     //初始化,并开始维护协程  
  54.     v := sharded_var{make(chan int), make(chan int)}  
  55.     sharded_var_whachdog(v)  
  56.   
  57.     //读取初始化  
  58.     fmt.Println(<-v.reader)  
  59.     //写入一个值  
  60.     v.writer <- 1  
  61.     //读取新写入的值  
  62.     fmt.Println(<-v.reader)  
  63. }  


golang之select之超时使用

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "time"  
  6. )  
  7.   
  8. /**  
  9. * select之超时使用  
  10. * select的使用,会随机从case中筛选可执行操作,如果没有能执行的操作则阻塞。  
  11. * 使用超时避免读阻塞,使用缓冲避免写阻塞  
  12. * @author: niuyufu  
  13.  */  
  14. func main() {  
  15.     timeout := make(chan bool, 1)  
  16.     ch := make(chan int)  
  17.   
  18.     //每秒生产一下true数据  
  19.     go func() {  
  20.         time.Sleep(1e9) //sleep one second  
  21.         timeout <- true  
  22.     }()  
  23.   
  24.     select {  
  25.     case <-ch:  
  26.         fmt.Println("ch pop")  
  27.     case <-timeout:  
  28.         fmt.Println("timeout!")  
  29.     }  
  30. }  


golang之select之默认值操作

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5. )  
  6.   
  7. /**  
  8. * select之默认值操作  
  9. * 没有能操作的case时,默认调用default操作  
  10. * @author: niuyufu  
  11.  */  
  12. func main() {  
  13.     ch1 := make(chan int, 1)  
  14.     ch2 := make(chan int, 1)  
  15.   
  16.     //协程操作不仅能同步调用还能异步调用  
  17.     ch1 <- 1  
  18.     //同步  
  19.     select {  
  20.     case <-ch1:  
  21.         fmt.Println("ch1 pop one element")  
  22.     case <-ch2:  
  23.         fmt.Println("ch2 pop one element")  
  24.     default:  
  25.         fmt.Println("default")  
  26.     }  
  27. }  


golang之select验证是否通道写满?

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5. )  
  6.   
  7. /**  
  8. * select验证是否通道写满?  
  9. * @author: niuyufu  
  10.  */  
  11. func main() {  
  12.     ch1 := make(chan int, 1)  
  13.     ch1 <- 1  
  14.     select {  
  15.     case ch1 <- 2:  
  16.         fmt.Println("channel is not full !")  
  17.     default:  
  18.         fmt.Println("channel is full !")  
  19.     }  
  20. }  


golang之生产者消费者

[plain]  view plain  copy
 print ?
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "time"  
  6. )  
  7.   
  8. func main() {  
  9.   
  10.     ch := make(chan int, 1)  
  11.     timeout := make(chan bool, 1)  
  12.   
  13.     //生产者  
  14.     go func() {  
  15.         for i := 0; i < 5; i++ {  
  16.             ch <- i  
  17.             fmt.Println("生产了:%d", i)  
  18.         }  
  19.     }()  
  20.   
  21.     //消费者  
  22.     var value int  
  23.     //设置最大操作数  
  24.     for i := 0; i < 10; i++ {  
  25.         //每秒生产一下true数据  
  26.         go func() {  
  27.             time.Sleep(10 * time.Microsecond) //sleep one second  
  28.             timeout <- true  
  29.         }()  
  30.         select {  
  31.         case value = <-ch:  
  32.             fmt.Println("消费了:%d", value)  
  33.         case <-timeout:  
  34.             fmt.Println("timeout!")  
  35.         }  
  36.     }  
  37. }  

http://blog.csdn.net/zhjih123/article/details/41604313

你可能感兴趣的:(Golang)