在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用了goroutine实现了多线程,使用chan来控制多线程。
1 package main 2 3 import ( 4 "fmt" 5 "runtime" 6 ) 7 8 var quit chan int = make(chan int) 9 10 func print10to19( split_index int) { 11 fmt.Println("Start******print10to19 ") 12 for i := 0; i <= split_index; i++ { 13 // 显式地让出CPU时间给其他goroutine 14 runtime.Gosched() 15 fmt.Println("******10to19: ", i) 16 } 17 fmt.Println("End******print10to19 ") 18 quit <- 1 19 } 20 21 func print20to29(split_index int ) { 22 fmt.Println("Start======print20to29 ") 23 for i := split_index ; i <= 43; i++ { 24 // 显式地让出CPU时间给其他goroutine 25 runtime.Gosched() 26 fmt.Println("======20to29: ", i) 27 } 28 fmt.Println("End======print20to29 ") 29 quit <- 2 30 } 31 32 func print30to39() { 33 fmt.Println("Start######print30to39 ") 34 for i := 30; i < 40; i++ { 35 // 显式地让出CPU时间给其他goroutine 36 runtime.Gosched() 37 fmt.Println("######30to39: ", i) 38 } 39 fmt.Println("End######print30to39 ") 40 quit <- 0 41 } 42 43 func main() { 44 // 设置最大开n个原生线程 45 runtime.GOMAXPROCS(3) 46 47 fmt.Println("start ---") 48 49 split_index := split_token() 50 51 go print10to19(split_index) 52 go print20to29(split_index + 1) 53 // go print30to39() 54 55 // go print10to19(begin1,end1) 56 // go print20to29(begin2,end2) 57 fmt.Println("start ===") 58 for i := 0; i < 2; i++ { 59 sc := <-quit 60 fmt.Println("sc:", sc) 61 } 62 63 fmt.Println("end") 64 } 65 66 67 // 拆分设备组 68 func split_token() int{ 69 70 // redisMaster := midware.NewPRedis(config.Config.GetString("REDIS_MASTER")) 71 // group_len, err := redisMaster.ZCard(str.GID) // 获取redis组的设备总数 72 73 // 测试:拆分成2个协程 74 // split_task(2,0,group_len) 75 res := split_task(2,0,43) 76 return res 77 } 78 79 80 func split_task(N int, WholeBegin int, WholeEnd int) int{ 81 82 res := (WholeEnd - WholeBegin) / N 83 84 switch res { 85 case 0: 86 fmt.Printf("0....%s",WholeEnd) 87 default: 88 fmt.Printf("Default012", res) 89 } 90 91 return res 92 }
运行程序: 可以看出,进程1跑的是0——21,进程2跑的是22——43, 这里拆分成2个进程。可根据自己的需求,拆分成多个进程处理。多个进程同时跑拆分一个大的group组的数据。 这种场景是:一个很大的数据表,若M个亿的数据,要是开启单进程执行的话,可能需要时间T; 但要是开启多N个进程,拆分这个M个亿的数据,相当于每个进程同时在处理M/N 的数据,分而治之的处理一个很大的数据量。
|
请发表评论