首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何停止goroutine

如何停止goroutine
EN

Stack Overflow用户
提问于 2011-07-24 23:05:04
回答 7查看 154.4K关注 0票数 125

我有一个goroutine,它调用一个方法,并在一个通道上传递返回值:

代码语言:javascript
复制
ch := make(chan int, 100)
go func(){
    for {
        ch <- do_stuff()
    }
}()

我如何阻止这样的goroutine?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-12 03:19:12

EDIT:我匆忙写了这个答案,然后才意识到你的问题是关于将值发送到goroutine中的chan。下面的方法既可以使用上面建议的附加chan,也可以使用您已经拥有的chan是双向的,您可以只使用其中的一个。

如果您的goroutine仅用于处理从chan传出的项,则可以使用"close“内置函数和通道的特殊接收表单。

也就是说,一旦你在chan上发送完项目,你就关闭它。然后,在goroutine中,您将获得接收操作符的一个额外参数,该参数显示通道是否已关闭。

下面是一个完整的示例( waitgroup用于确保该过程继续,直到goroutine完成):

代码语言:javascript
复制
package main

import "sync"
func main() {
    var wg sync.WaitGroup
    wg.Add(1)

    ch := make(chan int)
    go func() {
        for {
            foo, ok := <- ch
            if !ok {
                println("done")
                wg.Done()
                return
            }
            println(foo)
        }
    }()
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch)

    wg.Wait()
}
票数 65
EN

Stack Overflow用户

发布于 2011-07-24 23:39:25

通常,您向goroutine传递一个(可能是单独的)信号通道。当您希望goroutine停止时,该信号通道用于将一个值推入。goroutine定期对该频道进行民意调查。一旦检测到信号,它就会退出。

代码语言:javascript
复制
quit := make(chan bool)
go func() {
    for {
        select {
        case <- quit:
            return
        default:
            // Do other stuff
        }
    }
}()

// Do stuff

// Quit goroutine
quit <- true
票数 136
EN

Stack Overflow用户

发布于 2011-07-28 15:40:52

你不能从外面杀死一只大猩猩。您可以向goroutine发出停止使用通道的信号,但是goroutine上没有句柄来执行任何类型的元管理。Goroutines的目的是合作解决问题,所以杀死一个行为不端的人几乎永远不会是一个足够的反应。如果您想要隔离以获得健壮性,那么您可能需要一个进程。

票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6807590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档