上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
9.1.3 调度
除运行时自动调度外,某些时候需要手动控制任务执行。
挂起
暂时挂起任务,释放线程去执行其他任务。
当前任务被放回任务队列,等待下次被某个线程重新获取后继续执行。
也就是说,一个任务不一定由同一线程完成。实际上,除了主动协作调度外,还要考虑运行时抢占调度等因素。长时间运行的任务会被暂停,让其他等待任务有机会执行,以确保公平。
package main import ( "sync" "runtime" ) func main() { // 限制并发任务数。 runtime.GOMAXPROCS(1) var wg sync.WaitGroup wg.Add(2) a, b := make(chan struct{}), make(chan struct{}) go func() { defer wg.Done() <- a for i := 0; i < 5; i++ { println("a", i) } }() go func() { defer wg.Done() <- b for i := 0; i < 5; i++ { println("b", i) if i == 2 { runtime.Gosched() } } }() // 安排执行次序。 close(b) close(a) wg.Wait() } /* --- output ----------- b 0 b 1 b 2 <---- PAUSE a 0 a 1 a 2 a 3 a 4 b 3 <---- CONT b 4 */
发令
暂停一批任务,直到某个信号发出。
func main() { var wg sync.WaitGroup r := make(chan struct{}) for i := 0; i < 10; i++ { wg.Add(1) go func(id int){ defer wg.Done() <- r // 阻塞,等待信号。 println(id) }(i) } close(r) wg.Wait() }
也可反向使用 sync.WaitGroup
,让多个 goroutine Wait
,然后 main Done
。
类似实现,还有信号量,可以控制启动任务数量。
次序
多个任务按特定次序执行。
func main() { const CNT = 5 var wg sync.WaitGroup wg.Add(CNT) var chans [CNT]chan struct{} for i := 0; i < CNT; i++ { chans[i] = make(chan struct{}) go func(id int){ defer wg.Done() <- chans[id] println(id) }(i) } // 次序(延时,给调度器时间处理) for _, x := range []int{4, 0, 1, 3, 2} { close(chans[x]) time.Sleep(time.Millisecond * 10) } wg.Wait() }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论