您好,登錄后才能下訂單哦!
可以直接拿去當(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)
}
}
*/
免責(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)容。