go开启多进程——拆分多个进程同时处理(分而治之)

  使用了goroutine实现了多线程,使用chan来控制多线程。
runtime.GOMAXPROCS(3)来设置最大的原生线程。
runtime.Gosched() 显式地让出CPU时间给其他goroutine

代码如下:

 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 }
View Code

运行程序:

  可以看出,进程1跑的是0——21,进程2跑的是22——43,

这里拆分成2个进程。可根据自己的需求,拆分成多个进程处理。多个进程同时跑拆分一个大的group组的数据。

这种场景是:一个很大的数据表,若M个亿的数据,要是开启单进程执行的话,可能需要时间T;

但要是开启多N个进程,拆分这个M个亿的数据,相当于每个进程同时在处理M/N 的数据,分而治之的处理一个很大的数据量。

猜你喜欢

转载自www.cnblogs.com/unqiang/p/10299694.html
今日推荐