溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Golang億級(jí)高并發(fā)實(shí)例(代碼可直接使用)

發(fā)布時(shí)間:2020-07-29 14:08:48 來(lái)源:網(wǎng)絡(luò) 閱讀:5369 作者:wz669 欄目:編程語(yǔ)言

可以直接拿去當(dāng)成一個(gè)庫(kù)來(lái)用

舉例

package main
import "your/path/to/.../Concurrence"

//定義一個(gè)實(shí)現(xiàn)Job接口的數(shù)據(jù)
type Score struct {
    Num int
}
//定義對(duì)數(shù)據(jù)的處理
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) //設(shè)置最大線程數(shù)
    // 注冊(cè)工作池,傳入任務(wù)
    // 參數(shù)1 worker并發(fā)個(gè)數(shù)
    p := NewWorkerPool(num)
    p.Run()

    //寫(xiě)入一億條數(shù)據(jù)
    datanum := 100 * 100 * 100 * 100
    go func() {
        for i := 1; i <= datanum; i++ {
            sc := &Score{Num: i}
            p.JobQueue <- sc //數(shù)據(jù)傳進(jìn)去會(huì)被自動(dòng)執(zhí)行Do()方法,具體對(duì)數(shù)據(jù)的處理自己在Do()方法中定義
        }
    }()

//循環(huán)打印輸出當(dāng)前進(jìn)程的Goroutine 個(gè)數(shù)
    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)
    }
    // 循環(huán)獲取可用的worker,往worker中寫(xiě)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) //設(shè)置最大線程數(shù)
    // 注冊(cè)工作池,傳入任務(wù)
    // 參數(shù)1 worker并發(fā)個(gè)數(shù)
    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)
    }

}
*/
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI