博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang亿级高并发实例(代码可直接使用)
阅读量:6530 次
发布时间:2019-06-24

本文共 2659 字,大约阅读时间需要 8 分钟。

可以直接拿去当成一个库来用

举例

package mainimport "your/path/to/.../Concurrence"//定义一个实现Job接口的数据type Score struct {    Num int}//定义对数据的处理func (s *Score) Do() {    fmt.Println("num:", s.Num)    time.Sleep(1 * 1 * time.Second)}func main() {    num := 100 * 100 * 20    // debug.SetMaxThreads(num + 1000) //设置最大线程数    // 注册工作池,传入任务    // 参数1 worker并发个数    p := NewWorkerPool(num)    p.Run()    //写入一亿条数据    datanum := 100 * 100 * 100 * 100    go func() {        for i := 1; i <= datanum; i++ {            sc := &Score{Num: i}            p.JobQueue <- sc //数据传进去会被自动执行Do()方法,具体对数据的处理自己在Do()方法中定义        }    }()//循环打印输出当前进程的Goroutine 个数    for {        fmt.Println("runtime.NumGoroutine() :", runtime.NumGoroutine())        time.Sleep(2 * time.Second)    }}

Concurrence.go

package Concurrenceimport "fmt"// --------------------------- Job ---------------------type Job interface {    Do()}// --------------------------- Worker ---------------------type Worker struct {    JobQueue chan Job}func NewWorker() Worker {    return Worker{JobQueue: make(chan Job)}}func (w Worker) Run(wq chan chan Job) {    go func() {        for {            wq <- w.JobQueue            select {            case job := <-w.JobQueue:                job.Do()            }        }    }()}// --------------------------- WorkerPool ---------------------type WorkerPool struct {    workerlen   int    JobQueue    chan Job    WorkerQueue chan chan Job}func NewWorkerPool(workerlen int) *WorkerPool {    return &WorkerPool{        workerlen:   workerlen,        JobQueue:    make(chan Job),        WorkerQueue: make(chan chan Job, workerlen),    }}func (wp *WorkerPool) Run() {    fmt.Println("初始化worker")    //初始化worker    for i := 0; i < wp.workerlen; i++ {        worker := NewWorker()        worker.Run(wp.WorkerQueue)    }    // 循环获取可用的worker,往worker中写job    go func() {        for {            select {            case job := <-wp.JobQueue:                worker := <-wp.WorkerQueue                worker <- job            }        }    }()}// --------------- 使用 --------------------/*type Score struct {    Num int}func (s *Score) Do() {    fmt.Println("num:", s.Num)    time.Sleep(1 * 1 * time.Second)}func main() {    num := 100 * 100 * 20    // debug.SetMaxThreads(num + 1000) //设置最大线程数    // 注册工作池,传入任务    // 参数1 worker并发个数    p := NewWorkerPool(num)    p.Run()    datanum := 100 * 100 * 100 * 100    go func() {        for i := 1; i <= datanum; i++ {            sc := &Score{Num: i}            p.JobQueue <- sc        }    }()    for {        fmt.Println("runtime.NumGoroutine() :", runtime.NumGoroutine())        time.Sleep(2 * time.Second)    }}*/

转载于:https://blog.51cto.com/11140372/2342953

你可能感兴趣的文章
在广州的犄角旮旯里,寻找老字号的独特味道
查看>>
Linux权限管理(基本权限、默认权限)
查看>>
corosync+pacemaker实现高可用集群
查看>>
我的友情链接
查看>>
LVM管理 - PV,VG以及LV
查看>>
Java集合的知识点
查看>>
Unity资源管理原理知识
查看>>
Maven生命周期详解
查看>>
【Android】Uri、UriMatcher、ContentUris详解
查看>>
xargs用法
查看>>
Composer 安装
查看>>
cacti插件的下载链接
查看>>
SpringMVC 搭建
查看>>
CentOS中查看物理CPU信息的方法
查看>>
Spring如何为bean注入null值
查看>>
300+零售CIO大咖齐聚杭州 他们聊了什么?
查看>>
【游戏开发备注之二】配置Xcode版本控制SVN详细步骤内含部分问题解决方案
查看>>
学习编程,如果当初有人给我这些忠告就该有多好!
查看>>
书生教你cocos2d-x-保卫萝卜(四)
查看>>
怎么关联eclipse和夜神安卓模拟器
查看>>