goProject/.svn/pristine/d1/d13ac46b10658b7f1d9a676fb7ac48039ce5811d.svn-base
2025-01-06 16:21:36 +08:00

73 lines
1.7 KiB
Plaintext

package sqlAsyncMgr
import (
"fmt"
"github.com/jinzhu/gorm"
"goutil/logUtil"
"goutil/stringUtil"
)
type SqlAsyncWorkerPool struct {
// 工作者数量
wcount int32
// 工作者列表
workers []*SqlAsyncWorker
}
// newSqlAsyncWorkerPool 构造同步池
func newSqlAsyncWorkerPool(workerCount int32, _flushCallBack func(*SqlAsyncItemModel), _logAction func(logUtil.LogType, string), _getSyncName func() string, db *gorm.DB) *SqlAsyncWorkerPool {
result := &SqlAsyncWorkerPool{
wcount: workerCount,
workers: make([]*SqlAsyncWorker, workerCount, workerCount),
}
var i int32
for i = 0; i < workerCount; i++ {
newWorker := newSqlAsyncWorker(i, _flushCallBack, _logAction, _getSyncName, db)
result.workers[i] = newWorker
}
return result
}
// Start 启动
func (this *SqlAsyncWorkerPool) Start() {
for _, w := range this.workers {
w.Start()
}
}
// Stop 停止工作
func (this *SqlAsyncWorkerPool) Stop() []*SqlAsyncItemModel {
result := make([]*SqlAsyncItemModel, 0)
for _, w := range this.workers {
if tempList := w.Stop(); tempList != nil {
result = append(result, tempList...)
}
}
return result
}
// GetWork 获取指定work
func (this *SqlAsyncWorkerPool) GetWork(tableName string) (*SqlAsyncWorker, error) {
index := stringUtil.HashCode(tableName) % int(this.wcount)
if index < 0 || index >= int(this.wcount) {
return nil, fmt.Errorf("SqlAsyncWorkerPool中work数量为:%v,不存在id=%v的worker", this.wcount, index)
}
return this.workers[index], nil
}
// GetWaitSyncCount 获取待同步的sql数量
func (this *SqlAsyncWorkerPool) GetWaitSyncCount() int32 {
var count int32
for _, w := range this.workers {
count = count + w.WaitSqlCount()
}
return count
}