Golang有意义的问题-并发下的有序输出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Golang有意义的问题-并发下的有序输出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2094字,纯文字阅读大概需要3分钟。
内容图文
![Golang有意义的问题-并发下的有序输出](/upload/InfoBanner/zyjiaocheng/1035/e4baa844c056462c92c6db03f78f0bfe.jpg)
@Golang有意义的问题
和尚搬家
从前,有三个和尚,需要搬家,唯一的要求是要保证搬家前后房内物品布局一致,然后我编不下去了…
问
如何使用3个goroutine是由1-100的有序输出?
分析
问题的核心在于如何保证在并发条件下的有序输出。
主动控制式
package main
import (
"fmt"
"sync"
"time"
)
func main() {
q := make(chan int)
wg := new(sync.WaitGroup)
wg.Add(1)
go func(wg *sync.WaitGroup, q chan<- int) {
defer wg.Done()
defer close(q)
for i := 1; i <= 100; i++ {
q <- i
time.Sleep(time.Microsecond) // 利用休眠实现对生产者的控制,但这种方案不可靠
}
}(wg, q)
for i := 0; i < 3; i++ {
wg.Add(1)
go func(wg *sync.WaitGroup, q <-chan int) {
defer wg.Done()
for {
if v, ok := <-q; ok {
fmt.Println(v)
} else {
return
}
}
}(wg, q)
}
wg.Wait()
}
// 利用WaitGroup实现安全退出,使生产者休眠来进行控制,但是如果消费者的操作是耗时是不可靠谱的,就会变得不可靠
package main
import (
"fmt"
"time"
)
func print(ch <-chan int){
for{
fmt.Println(<-ch)
}
}
func main() {
ch0 :=make(chan int)
ch1 :=make(chan int)
ch2 :=make(chan int)
go print(ch0)
go print(ch1)
go print(ch2)
for i:=1; i<101; i++{
switch{
case i%3 == 0:
ch0 <- i
case i%3 == 1:
ch1 <- i
case i%3 == 2:
ch2 <-i
}
time.Sleep(time.Microsecond)
}
}
// 利用for循环实现安全退出,同样是使生产者休眠来进行控制,但是如果消费者的操作是耗时是不可靠谱的,就会变得不可靠
抢占式
package main
import (
"fmt"
"sync"
"time"
)
func main() {
q := make(chan int)
wg := new(sync.Mutex)
go func( q chan<- int) {
defer close(q)
for i := 1; i <= 100; i++ {
q <- i
}
}(q)
for i := 0; i < 3; i++ {
go func(wg *sync.Mutex, q <-chan int) {
for {
wg.Lock()
if v, ok := <-q; ok {
fmt.Println(v)
wg.Unlock()
} else {
wg.Unlock()
return
}
}
}(wg, q)
}
time.Sleep(time.Second) // 安全退出
}
// 使用互斥锁阻塞其他协程来实现抢占,使用休眠实现安全退出,这种方案是可靠的,但最好能够使用WaitGroup来实现安全退出
package main
import (
"fmt"
"time"
)
func main() {
a := 0
fn := func() int {
a++
return a
}
ch := make(chan int, 1)
defer close(ch)
for i := 0; i < 3; i++ {
go func() {
for {
ch <- 1
n := fn()
if n > 100 {
break
}
fmt.Println(n)
<-ch
}
}()
}
time.Sleep(time.Second) // 安全退出
}
// 使用管道来塞其他协程来实现抢占,使用休眠实现安全退出,这种方案是可靠的,同理,最好能够使用WaitGroup来实现安全退出
内容总结
以上是互联网集市为您收集整理的Golang有意义的问题-并发下的有序输出全部内容,希望文章能够帮你解决Golang有意义的问题-并发下的有序输出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。