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

yinshidaoshi · 2018-01-15 21:47:16 · 1697 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-01-15 21:47:16 的主题,其中的信息可能已经有所发展或是发生改变。

协程交替执行,使其能顺序输出1-20的自然数

package main

import (
    "fmt"
    "time"
)

func main() {

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

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

time.Sleep(3*time.Second)
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1697 次点击  
加入收藏 微博
7 回复  |  直到 2018-01-19 15:12:30
channel
channel · #1 · 7年之前

试试这样:

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)
}
lyp256
lyp256 · #2 · 7年之前

试试我的歪招,哈哈

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)
}
victorl
victorl · #3 · 7年之前
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
}
GreatBedAwake
GreatBedAwake · #4 · 7年之前
package main

import (
    "fmt"
    "time"
)

func main() {
    waitOdd := make(chan struct{}, 1)
    waitEnev := make(chan struct{}, 1)
    waitEnev <- struct{}{}
    go odd(waitOdd, waitEnev)
    go enev(waitOdd, waitEnev)
    time.Sleep(3 * time.Minute)
}

func odd(waitodd, waitenev chan struct{}) {
    for i := 0; i < 10; i++ {
        <-waitodd
        fmt.Println(i*2 + 1)
        waitenev <- struct{}{}

    }
}

func enev(waitodd, waitenev chan struct{}) {
    for i := 0; i < 10; i++ {
        <-waitenev
        fmt.Println(i * 2)
        waitodd <- struct{}{}
    }
}
90design
90design · #5 · 7年之前
package main

import "fmt"

func main() {
    A := make(chan bool, 1)
    B := make(chan bool)
    Exit := make(chan bool)

    go func() {
        for i := 1; i <= 20; i++ {
            if ok := <-A; ok {
                fmt.Println("A = ", 2*i-1)
                B <- true
            }
        }
    }()
    go func() {
        defer func() {
            close(Exit)
        }()
        for i := 1; i <= 20; i++ {
            if ok := <-B; ok {
                fmt.Println("B : ", 2*i)
                A <- true
            }
        }
    }()

    A <- true
    <-Exit
}
90design
90design · #6 · 7年之前

3楼的写法也很好哦

fanshufen001
fanshufen001 · #7 · 7年之前

三楼写法确实不错

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传