zoukankan      html  css  js  c++  java
  • 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 的数据,分而治之的处理一个很大的数据量。

  • 相关阅读:
    C++多态性的总结
    php 基于curl 实现,模拟多线程任务
    php 解决跨域问题
    vue-cli 使用步骤
    php 图片转成base64 前后台示例
    jq 实现选项卡效果
    javascript仿es6的map类
    PHP生成word并可下载
    vue 实现的树形菜单
    vue之路由的基本用法
  • 原文地址:https://www.cnblogs.com/unqiang/p/10299694.html
Copyright © 2011-2022 走看看