如何做情趣网站池州网站制作优化
如何做情趣网站,池州网站制作优化,网站开发说明文档,大连做网站建设golang的协程和通道#xff0c;之前就看过了#xff0c;一直没有很好的理解#xff0c;所以一直也没记录#xff0c;今天看书#xff0c;看到有一个总结的章节#xff0c;里面记录了一些注意事项#xff0c;因此写个文档#xff0c;记录一下#xff0c;避免以后自己忘… golang的协程和通道之前就看过了一直没有很好的理解所以一直也没记录今天看书看到有一个总结的章节里面记录了一些注意事项因此写个文档记录一下避免以后自己忘了或者是找不见资料 顺便吐槽下公司的业务自己负责的业务能啥也不知道开发完了给他们上线了完事还问你这个为什么会这样这不是你要求的吗UAT的时候业务全程参加都看过了没问题才上线过了一个月尽然能忘得一干二净。 出于性能考虑的建议 实践经验表明为了使并行运算获得高于串行运算的效率在协程内部完成的工作量必须远远高于协程的创建和相互来回通信的开销。 出于性能考虑建议使用带缓存的通道 使用带缓存的通道可以很轻易成倍提高它的吞吐量某些场景其性能可以提高至 10 倍甚至更多。通过调整通道的容量甚至可以尝试着更进一步的优化其性能。 限制一个通道的数据数量并将它们封装成一个数组 如果使用通道传递大量单独的数据那么通道将变成性能瓶颈。然而将数据块打包封装成数组在接收端解压数据时性能可以提高至 10 倍。 现在创建一个带缓存的通道ch : make(chan type,buf) 1如何使用 for 或者 for-range 遍历一个通道尽量使用这种或者是跟select配合使用 这种其实就是一个for循环遍历通道但是golang的机制这里会自动监测通道是否关闭而不需要开发二次判断通道是否关闭 但是这里有个坑需要注意会有死锁的问题因为你的通道中没有数据的时候for range ch 会发生阻塞但是无法解除阻塞发生死锁 for v : range ch {// do something with v
}2如何检测一个通道 ch 是否关闭 //read channel until it closes or error-condition
for {if input, open : -ch; !open {// 这里!open就是表示通道已经被关了break跳出循环不从通道里面获取数据了break}fmt.Printf(%s, input)
}3如何通过一个通道让主程序等待直到协程完成信号量模式如果希望程序一直阻塞在匿名函数中省略 ch - 1 即可。 ch : make(chan int) // Allocate a channel.
// Start something in a goroutine; when it completes, signal on the channel.
go func() {// doSomethingch - 1 // Send a signal; value does not matter.
}()
doSomethingElseForAWhile()
-ch // Wait for goroutine to finish; discard sent value.func compute(ch chan int){ch - someComputation() // when it completes, signal on the channel.
}func main(){ch : make(chan int) // allocate a channel.go compute(ch) // start something in a goroutinesdoSomethingElseForAWhile()result : - ch
}4通道的工厂模板以下函数是一个通道工厂启动一个匿名函数作为协程以生产通道 func pump() chan int {ch : make(chan int)go func() {for i : 0; ; i {ch - i}}()return ch
}5通道迭代器模板 func (c *container) Iter () - chan item {ch : make(chan item)go func () {for i: 0; i c.Len(); i{ // or use a for-range loopch - c.items[i]}} ()return ch
}for x : range container.Iter() { ... }6如何限制并发处理请求的数量 package mainconst MAXREQS 50var sem make(chan int, MAXREQS)type Request struct {a, b intreplyc chan int
}func process(r *Request) {// do something
}func handle(r *Request) {sem - 1 // doesnt matter what we put in itprocess(r)-sem // one empty place in the buffer: the next request can start
}func server(service chan *Request) {for {request : -servicego handle(request)}
}func main() {service : make(chan *Request)go server(service)
}7如何在多核CPU上实现并行计算 func DoAll(){sem : make(chan int, NCPU) // Buffering optional but sensiblefor i : 0; i NCPU; i {go DoPart(sem)}// Drain the channel sem, waiting for NCPU tasks to completefor i : 0; i NCPU; i {-sem // wait for one task to complete}// All done.
}func DoPart(sem chan int) {// do the part of the computationsem -1 // signal that this piece is done
}func main() {runtime.GOMAXPROCS(NCPU) // runtime.GOMAXPROCS NCPUDoAll()
}8如何终止一个协程runtime.Goexit() 9简单的超时模板 timeout : make(chan bool, 1)
go func() {time.Sleep(1e9) // one second timeout - true
}()
select {case -ch:// a read from ch has occurredcase -timeout:// the read from ch has timed out
}10如何使用输入通道和输出通道代替锁 func Worker(in, out chan *Task) {for {t : -inprocess(t)out - t}
}11如何在同步调用运行时间过长时将之丢弃 // 注意缓冲大小设置为 1 是必要的可以避免协程死锁以及确保超时的通道可以被垃圾回收。
// 此外需要注意在有多个 case 符合条件时 select 对 case 的选择是伪随机的
// 如果代码稍作修改如下
// 则 select 语句可能不会在定时器超时信号到来时立刻选中 time.After(timeoutNs) 对应的 case
// 因此协程可能不会严格按照定时器设置的时间结束。
ch : make(chan int, 1)
go func() { for { ch - 1 } } ()
L:
for {select {case -ch:// do somethingcase -time.After(timeoutNs):// call timed outbreak L}
}12如何在通道中使用计时器和定时器定时器 (Timer) 结构体和计时器 (Ticker) 结构体 package mainimport (fmttime
)func main() {tick : time.Tick(1e8)boom : time.After(5e8)for {select {case -tick:fmt.Println(tick.)case -boom:fmt.Println(BOOM!)returndefault:fmt.Println( .)time.Sleep(5e7)}}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87026.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!