初学乍练,求教怎么让协程交替执行

yinshidaoshi · 2018-01-15 21:47:16 · 1715 次点击

试试我的歪招,哈哈

package main

import (
    "fmt"
    "time"
)

func main() {

    c1 := make(chan int)
    c2 := make(chan int)

    go func() {
        for i := 1; i <= 10; i++ {
            <-c1
            go func(i int) {
                fmt.Println(2*i - 1)
                c2<-1
            }(i)

        }
    }()
    go func() {
        for i := 1; i <= 10; i++ {
            <-c2
            go func(i int) {
                fmt.Println(2 * i)
                c1 <- 1
            }(i)
        }
    }()
    c1<-1
    time.Sleep(3 * time.Second)
}
#2
更多评论

试试这样:

func main() {
    runtime.GOMAXPROCS(1)

    c1 := make(chan struct{}, 1)
    c2 := make(chan struct{}, 1)

    for i := 1; i <= 10; i++ {
        go func(i int) {
            <-c1
            fmt.Println(2*i - 1)
            c2 <- struct{}{}
        }(i)
    }

    for i := 1; i <= 10; i++ {
        go func(i int) {
            <-c2
            fmt.Println(2 * i)
            c1 <- struct{}{}
        }(i)
    }
    c1 <- struct{}{}
    c2 <- struct{}{}

    time.Sleep(3 * time.Second)
}
#1
package main

func main() {
    ch := make(chan int)
    exit := make(chan struct{})

    go func() {
        for i := 1; i <= 20; i++ {
            println("g1:", <-ch)
            i++
            ch <- i
        }
    }()

    go func() {
        defer func() {
            close(ch)
            close(exit)
        }()
        for i := 0; i < 20; i++ {
            i++
            ch <- i
            println("g2:", <-ch)
        }
    }()

    <-exit
}
#3