赞
踩
原本有一个单线程执行器,用来执行多任务计算,但是单线程执行并没有很好利用系统多核 CPU 资源的优势。于是,需要把执行器改成并发执行的执行器。
首先,有一点需要明确的是,需要的进行计算的多任务并不是一次就抛出来的。这是一个实际中遇到的真实的情况。
任务的来源,是一个单线程的计算结果,至于单线程内部做了什么事情,这里不需要关心,重要的是该单线程的返回结果,如果不抛出异常,有可能可以返回多个可并发执行的任务,也可能一个任务也不会返回,但是下一次在执行单线程,有可能能返回可并发执行任务。
这是因为前面一个批次的某个任务或者某几个任务包含后面任务需要的关键输入参数、如果参数得不到满足、单线程不会将任务抛出。只有当任务需要的关键参数全部满足,单线程才会将任务抛出来。
当任务被单线程抛出之后,需要充分调动多核CPU资源的优势,进行并行计算,同时又要作出限制,不能随便就出现内存溢出这种情况。
所以,构造线程池就成为了解决方案之一。
// 定义线程池
type HashSyncWorker struct {
workerCount uint32
workers map[uint32]*SyncWorker
}
// 创建 workers 个线程,并给每个线程创建一个 goroutine
// 每个 goroutine 监听一个 channel ,并给channel 设置缓冲区大小为 size
func NewHashSyncWorker(workers uint32, size int) *HashSyncWorker {
hashWorker := &HashSyncWorker {
workerCoun
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。