本文主要研究一下tunny的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属性
func (w *workerWrapper) interrupt() {
close(w.interruptChan)
w.worker.Interrupt()
}
interrupt方法关闭w.interruptChan,执行w.worker.Interrupt()
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
func (w *workerWrapper) stop() {
close(w.closeChan)
}
stop方法关闭w.closeChan
func (w *workerWrapper) join() {
<-w.closedChan
}
join方法则等待w.closedChan
tunny的workerWrapper包装了worker,定义了interruptChan、reqChan、closeChan、closedChan属性,它提供了interrupt、run、stop、join方法。
先看效果: html a href=# span/span span/span span/span span/span Move on/a ...
Dreamweaver中如何使用Flash影片 1、首先需要我们准备的是一个Flash文件,其次最...
Dreamweaver怎么显示欢迎屏幕,今天打开Dreamweaver CS6发现欢迎屏幕没了,没有...
简介: 在2019年,阿里巴巴文娱的淘票票几乎涉足了当时市面上所有的小程序。在不...
使用CSS3 border-image 属性,你可以在元素的周围设置图片边框。 一、浏览器支持...
Dreamweaver站点中如何新建文件夹和修改、删除、移动文件 1、在如下图中呢是我们...
使用css的filter写鼠标滑过效果 div class=filter-div img class=filter-img src...
本次主要来了解的是布局,这个大部分在HTML的基本标签中也是存在的,所以相对比...
设计师要懂心理学读书笔记 设计师要懂心理学这本书很有趣,首先它很简单,任何对...
在修改一个网页时,会遇到要更换所有网页超链接网址的问题,有时候一个页面的超...