分享
  1. 首页
  2. 文章

Golang亿级高并发实例(代码可直接使用)

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

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

举例

package main
import "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 Concurrence
import "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)
 }
}
*/

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

本文来自:51CTO博客

感谢作者:wz669

查看原文:Golang亿级高并发实例(代码可直接使用)

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

关注微信
3385 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏