共计 1689 个字符,预计需要花费 5 分钟才能阅读完成。
序
本文次要钻研一下 tunny 的 workerWrapper
workerWrapper
type workerWrapper struct { | |
worker Worker | |
interruptChan chan struct{} | |
// reqChan is NOT owned by this type, it is used to send requests for work. | |
reqChan chan<- workRequest | |
// closeChan can be closed in order to cleanly shutdown this worker. | |
closeChan chan struct{} | |
// closedChan is closed by the run() goroutine when it exits. | |
closedChan chan struct{}} | |
func newWorkerWrapper( | |
reqChan chan<- workRequest, | |
worker Worker, | |
) *workerWrapper { | |
w := workerWrapper{ | |
worker: worker, | |
interruptChan: make(chan struct{}), | |
reqChan: reqChan, | |
closeChan: make(chan struct{}), | |
closedChan: make(chan struct{}), | |
} | |
go w.run() | |
return &w | |
} |
workerWrapper 包装了 worker,定义了 interruptChan、reqChan、closeChan、closedChan 属性
interrupt
func (w *workerWrapper) interrupt() {close(w.interruptChan) | |
w.worker.Interrupt()} |
interrupt 办法敞开 w.interruptChan,执行 w.worker.Interrupt()
run
func (w *workerWrapper) run() {jobChan, retChan := make(chan interface{}), make(chan interface{}) | |
defer func() {w.worker.Terminate() | |
close(retChan) | |
close(w.closedChan) | |
}() | |
for { | |
// NOTE: Blocking here will prevent the worker from closing down. | |
w.worker.BlockUntilReady() | |
select { | |
case w.reqChan <- workRequest{ | |
jobChan: jobChan, | |
retChan: retChan, | |
interruptFunc: w.interrupt, | |
}: | |
select { | |
case payload := <-jobChan: | |
result := w.worker.Process(payload) | |
select { | |
case retChan <- result: | |
case <-w.interruptChan: | |
w.interruptChan = make(chan struct{}) | |
} | |
case _, _ = <-w.interruptChan: | |
w.interruptChan = make(chan struct{}) | |
} | |
case <-w.closeChan: | |
return | |
} | |
} | |
} |
run 首先创立 jobChan、retChan,而后 for 循环执行 select 读取 reqChan,之后读取 jobChan 的 payload,进行解决,而后写入到 retChan
stop
func (w *workerWrapper) stop() {close(w.closeChan) | |
} |
stop 办法敞开 w.closeChan
join
func (w *workerWrapper) join() {<-w.closedChan}
join 办法则期待 w.closedChan
小结
tunny 的 workerWrapper 包装了 worker,定义了 interruptChan、reqChan、closeChan、closedChan 属性,它提供了 interrupt、run、stop、join 办法。
doc
- tunny
正文完