loops - Golang 在带有 channel 的 goroutine 中暂停循环

标签 loops go channel pause

我有一个作为 goroutine 启动的函数:

func (bt *BlinkyTape) finiteLoop(frames []Frame, repeat int, delay time.Duration) {
    bt.isPlaying = true
L:
    for i := 0; i < repeat; i++ {
        select {
        case <-bt.stop:
            break L
        default:
            bt.playFrames(frames, delay)
        }
    }
    bt.isPlaying = false
}

此函数使用 channel ,因此可以打破循环(循环可以是有限的或无限的)

我想实现的是一种暂停循环执行并当然能够恢复它的方法。

我想在选择条件中添加另一个案例,我在另一个 channel pause 上收听。如果案例被执行,它会进入一个什么都不做的新的无限循环。然后,它将需要与以前相同的系统和一个 resume channel 来打破这个循环。

你怎么看?有没有更好的方法来实现我的需要?

问候

最佳答案

在带有 channel 的 goroutine 中暂停循环,使用 playpausequit channel ,就像这个工作示例代码一样:

package main

import "fmt"
import "time"
import "sync"

func routine() {
    for {
        select {
        case <-pause:
            fmt.Println("pause")
            select {
            case <-play:
                fmt.Println("play")
            case <-quit:
                wg.Done()
                return
            }
        case <-quit:
            wg.Done()
            return
        default:
            work()
        }
    }
}

func main() {
    wg.Add(1)
    go routine()

    time.Sleep(1 * time.Second)
    pause <- struct{}{}

    time.Sleep(1 * time.Second)
    play <- struct{}{}

    time.Sleep(1 * time.Second)
    pause <- struct{}{}

    time.Sleep(1 * time.Second)
    play <- struct{}{}

    time.Sleep(1 * time.Second)
    close(quit)

    wg.Wait()
    fmt.Println("done")
}

func work() {
    time.Sleep(250 * time.Millisecond)
    i++
    fmt.Println(i)
}

var play = make(chan struct{})
var pause = make(chan struct{})
var quit = make(chan struct{})
var wg sync.WaitGroup
var i = 0

输出:

1
2
3
4
pause
play
5
6
7
8
pause
play
9
10
11
12
done

关于loops - Golang 在带有 channel 的 goroutine 中暂停循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38798863/

相关文章:

javascript - 如何在 Javascript 中创建数组的数组?

javascript - HTML/JavaScript : How to run a loop while running other code?

sql - SetConnMaxLifetime如何在golang database/sql上工作

go - 关闭已完成的 channel 后,goroutine中缺少打印内容

go - 为什么这些 goroutines 不阻塞?

go - 当非默认是输入 channel 时,为什么 select in go 总是进入默认情况?

php - 如何使用特定于最后一行的条件回显循环中的特定数据

java - 集和 ConcurrentModificationException

go - 如何列出指向golang struct所有字段的指针?

go - 找不到包 "testing/internal/testdeps"