golang多线程简单逻辑

你说你要一场 · · 843 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

目标

实现指定个核心最大化使用,比如核心总数减一。

代码

package main
import (
    "runtime"
    "sync"
)
var (
    cpunum = runtime.NumCPU()-1
)
func main(){
    ch := make(chan string)
    runtime.GOMAXPROCS(cpunum)
    wg := sync.WaitGroup{}

    for i := 0; i < cpunum; i++{
        go WgReadLogs(ch, &wg)
    }

    wg.Add(2)
    ch <- "./health/stat1.rec"
    ch <- "./report/stat2.rec"
    wg.Wait()
    close(ch)
}
func WgReadLogs(ch chan string,wg *sync.WaitGroup){
    for true{
    tmp,ok := <-ch
    if !ok{
        break
    }
    ReadLogs(tmp)
    wg.Done()
    }
}
func ReadLogs(logname string){
    fmt.Println(logname)
}

解释

import (
    "runtime"
    "sync"
)

必要的库。

var (
    cpunum = runtime.NumCPU()-1
)

要使用的cpu数量,建议不全使用。

    ch := make(chan string)
    runtime.GOMAXPROCS(cpunum)
    wg := sync.WaitGroup{}

建立管道。
声明使用的cpu数。
建立互斥关系,本例中主要为了实现所有线程执行完后再执行后续程序。

    for i := 0; i < cpunum; i++{
        go WgReadLogs(ch, &wg)
    }

创建cpu数减1个线程

    wg.Add(2)
    ch <- "./health/stat1.rec"
    ch <- "./report/stat2.rec"
    wg.Wait()
    close(ch)

后面每个任务结束时要done一个wg,这里根据具体情况加,是循环就在每个循环里加,保证后面能全部done即可
没有缓冲的、阻塞式的往管道传递字符串。
Wait是等所有线程都执行完,即增加的数字被全done掉。
关闭管道。

func WgReadLogs(ch chan string,wg *sync.WaitGroup){
    for true{
        tmp,ok := <-ch
        if !ok{
            break
        }
        ReadLogs(tmp)
        wg.Done()
    }
}

假设已有的函数是ReadLogs,在它的基础上加个Wg加函数名的新函数,我觉得这种方式不改变原有的,比较舒服。
大意是:循环从管道读取字符串,读不到了就跳出循环。
每个ReadLogs()之后加一个wg.Done(),相当于计数减一。

ReadLogs()就是要执行的任务,不再解释。

总结

就是开指定个线程。
管道阻塞传值。
wg同步。
WgReadLogs循环接收。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:你说你要一场

查看原文:golang多线程简单逻辑

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

843 次点击  
加入收藏 微博
1 回复  |  直到 2021-01-14 15:42:52
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传