当前位置: 首页 > 知识库问答 >
问题:

通道缓冲区在golang中如何工作,当没有goroutines(在其范围内)使用时,与当它们被传递到goroutines时相比?

袁泰
2023-03-14

我在戈朗绝对是新手。我正在通过围棋之旅学习,然后用自己的理解来实现想法。我和Goroutines有问题。我创建了一个未缓冲的通道,然后向该通道发送了一个字符串。

func main() {
    p := make(chan string)
    p <- "Hello goroutine"
    fmt.Println(<-p)
}

抛出错误

致命错误:所有goroutines都睡着了-死锁!

func main() {
    p := make(chan string)
    go sendHello(p)
    fmt.Println(<-p)
}

func sendHello(p chan string) {
    p <- "Hello goroutine"
}

共有1个答案

昝宜
2023-03-14

请记住,通道有两端,发送者和接收者。你的问题是行刑顺序。

在第一个示例中,当您使用未缓冲的通道时,该通道需要接收方,而在发送hello goroutine消息时没有接收方,并等待直到有接收方(缓冲通道不是这样,因为它不需要等待),并且执行永远不会到达下一行(即死锁)。

但是在第二个示例中,接收者绑定到信道,然后执行groutine,发送者和接收者都不处于等待状态。

 类似资料:
  • 问题内容: 其他goroutine在调用syscall时如何继续执行?(当使用GOMAXPROCS = 1时) 据我所知,调用syscall时,线程放弃控制,直到syscall返回。Go如何在不按每个系统调用阻塞程序创建系统线程的情况下实现这种并发性? 从文档中: Goroutines 之所以称它们为goroutine,是因为现有术语(线程,协程,进程等)传达了不准确的含义。goroutine有一

  • 我想要一个可以观察到的: 可以按需发出项目,但从未真正完成(一个热的可观察的?) 知道何时有订阅者 如果没有订阅服务器,它将缓冲我告诉它发出的项 订阅后,它将按顺序发出缓冲项,然后清除缓冲区,然后继续允许我发出更多项 取消订阅时(订阅服务器已释放?),它将返回缓冲。 这是我所想的一个伪代码--我没有必要的回调来正确地执行此操作。另外,如果我能把它全部用一个可观察的或主题来包装,那就好了。

  • 问题内容: 我使用goroutines实现http.Get超时,然后我发现goroutines的数量一直在稳定增长,当达到1000左右时,程序将退出 码: http://play.golang.org/p/SzGTMMmZkI 问题答案: 用1而不是0初始化chan: 并删除关闭并延迟ch的延迟块。 参见:http : //blog.golang.org/go-concurrency-patter

  • 我从两个通道中获得了多个的goroutine:一个chan提供数据,一个chan提供信号(类似于done/quit通道)。 我使用signals通道来捕获信号(杀死)并优雅地关闭Goroutines。 当我终止正在运行的进程时,我会看到来自的打印消息。我预计,一旦通道关闭,goroutines将thecase并返回。 但他们不停地奔跑;它们继续处理中的项。好像被忽视了。我在这里漏掉了什么?频道不是

  • 所有的, 现在,我试图避免的是下面的连接语句代码,其中我将代码包装在goroutine中的错误处理中(类似于以下内容): 相反,如果存在连接问题,我宁愿将整个过程短路,然后立即以错误退出goroutine,我也不愿意担心如何构造代码。我也许可以进一步包装_send_ack并将通道作为函数参数发送--但是如果程序是高度分层的,这就变得不确定了。例如,我可能有一个由几个函数组成的goroutine,每

  • 问题内容: 我正在使用controllerAs语法来避免控制器中的$ scope汤,并且还使用ui.bootstrap来呈现模式视图。 我需要打开一个与当前控制器共享相同作用域的modalInstace。注入示波器时,您可能会执行以下操作: 但是,由于我没有注入作用域,而是使用controllerAs语法,因此无法正常工作。 根据我的发现,您将需要使用resolve来传递数据,但是必须通过函数显式