golang多线程简单逻辑
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang多线程简单逻辑相关的知识,希望对你有一定的参考价值。
参考技术A 实现指定个核心最大化使用,比如核心总数减一。必要的库。
要使用的cpu数量,建议不全使用。
建立管道。
声明使用的cpu数。
建立互斥关系,本例中主要为了实现所有线程执行完后再执行后续程序。
创建cpu数减1个线程
后面每个任务结束时要done一个wg,这里根据具体情况加,是循环就在每个循环里加,保证后面能全部done即可
没有缓冲的、阻塞式的往管道传递字符串。
Wait是等所有线程都执行完,即增加的数字被全done掉。
关闭管道。
假设已有的函数是ReadLogs,在它的基础上加个Wg加函数名的新函数,我觉得这种方式不改变原有的,比较舒服。
大意是:循环从管道读取字符串,读不到了就跳出循环。
每个ReadLogs()之后加一个wg.Done(),相当于计数减一。
ReadLogs()就是要执行的任务,不再解释。
就是开指定个线程。
管道阻塞传值。
wg同步。
WgReadLogs循环接收。
golang多线程
gopkg.in/go-playground/pool.v3
package main
import (
"fmt"
"gopkg.in/go-playground/pool.v3"
"time"
)
func newThreadFunc(p pool.Pool, value int) pool.WorkUnit {
var fn pool.WorkFunc
fn = func(pool.WorkUnit) (interface{}, error){
time.Sleep(time.Second * 10)
fmt.Println("Hello, this is %d.", value)
return true, nil
}
return p.Queue(fn)
}
func main() {
p := pool.NewLimited(5)
defer p.Close()
works := make([]pool.WorkUnit, 0)
for i := 0; i < 20; i++ {
works = append(works, newThreadFunc(p, i))
}
fmt.Println("Start!")
for _, item := range works {
item.Wait()
}
}
以上是关于golang多线程简单逻辑的主要内容,如果未能解决你的问题,请参考以下文章