问题标签 [goroutine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5140 浏览

go - 有没有更好的方法来停止 Go 中的无限 goroutine?

我使用 goroutines 制作了一个简单的时钟信号:

我知道这个时钟不精确,但这无关紧要。我想知道的是停止这个 goroutine 的最佳方法是什么?

理想情况下,我希望它在频道的任何听众超出范围时立即停止,但我确实知道如何做到这一点(很像垃圾收集器,但用于 goroutines)。我想出了两种手动停止它的方法:(1) 使用全局停止变量,所有此类 goroutine 都会检查每个循环;(2) 使用停止通道。这些方法的缺点是我必须手动停止 goroutines。

0 投票
2 回答
279 浏览

concurrency - goroutine的奇怪行为

我刚刚尝试了以下代码,但结果似乎有点奇怪。它先打印奇数,然后打印偶数。我真的很困惑。我曾希望它一个接一个地输出奇数和偶数,就像 1, 2, 3, 4... 一样。谁能帮我?

0 投票
8 回答
3759 浏览

java - Clojure / Java 中的 Goroutine 等价物

我最近很喜欢看Google IO 关于 Go 并发模式的演讲

尽管 Go 的并发方法(groutines、通过通道的通信)明显不同于 Clojure(不变性、管理引用、STM),但在 Clojure 上下文中的某些情况下,Go 方法似乎仍然有用。

那么对于 Go 的并发原语(可能是一个库),在 Clojure 或 Java 中是否有直接的等价物,特别是:

  • channel- 像对象一样阻塞,直到读写器在两端都可用
  • select可以在多个通道上等待结果的类似构造

PS对 Java 解决方案非常满意,因为它很容易从 Clojure 中使用

更新自从最初提出这个问题以来,Clojure 现在有了core.async,它提供了所有这些功能等等。

0 投票
4 回答
8316 浏览

go - Go 中的 Python 样式生成器

我目前正在完成Tour of Go,我认为 goroutine 的使用与 Python 生成器类似,尤其是在Question 66中。我认为 66 看起来很复杂,所以我将其重写为:

这似乎有效。几个问题:

  1. 如果我将通道上的缓冲区大小设置为 10,fibonacci则会尽快填满 10 个其他点,并且main会尽快吃掉这些点。这是正确的吗?这会比以内存为代价的缓冲区大小为 1 更高效,对吗?
  2. 由于通道没有被fibonacci发送者关闭,当我们在这里超出范围时会发生什么记忆?我的期望是一旦超出范围,通道及其上的所有内容都会被垃圾收集cgo fibonacci我的直觉告诉我,这可能不会发生。
0 投票
2 回答
804 浏览

range - Go:范围仅从通道接收奇数个值

我在http://tour.golang.org/的沙箱中运行此代码

我认为一旦我启动了覆盖通道的 goroutine,我将发送的所有值都会被打印出来。

但是如果我发送奇数个值(比如 1、2 和 3),所有值都会被打印出来。

如果我发送偶数个值(例如 1、2、3 和 4),则不会打印最后一个值。

似乎频道创建行:

当我添加不同大小的缓冲区时更改范围表达式的行为:

(我发送 4 个值)

为什么我发送偶数时没有收到最后一个值?


更多内容:

我也离线测试了这个,在 64 位 Linux 下编译。

我稍微改变了程序:

如果我取消该行cc <- 2000,那么所有内容都会被打印出来。但如果我把它注释掉,我只会得到 1、2 和 3。

好像是时间问题。我认为该行cc <- 1000会阻塞主要功能,直到所有通道都被读取。

0 投票
3 回答
728 浏览

memory - goroutines 内存不足 UPD:go 错误处理

UPD:原来,这是一个关于 Go 中的错误处理的问题

我编写了一个简单的网络爬虫,它在“主线程”上生成网页的地址,在一个 go-routine 中获取实际页面并通过 a 返回内容chan,并将其写入另一个 go-常规。但是,经过大约 300,000 次此过程的迭代,我收到以下错误:

错误“stacktrace”很长,不幸的是,我现在没有它(我会在重复实验后发布它)。

是否需要以某种方式管理内存、关闭通道或类似的东西?

下面是有一些遗漏的代码。

0 投票
3 回答
4683 浏览

go - 为什么这个 Go 代码会阻塞?

我写了以下程序:

由于通道事件列表是一个缓冲通道,我想我应该得到输出“嘿!”的 100 倍,但它只显示一次。我的错误在哪里?

0 投票
2 回答
9067 浏览

select - golang:除非我添加了 fmt.Print(),否则带有 select 的 goroute 不会停止

我尝试了 Go Tour练习 #71

如果它像 一样运行go run 71_hang.go ok,它工作正常。

但是,如果您使用go run 71_hang.go nogood,它将永远运行。

唯一的区别是语句fmt.Print("")default的额外内容。select

我不确定,但我怀疑某种无限循环和竞争条件?这是我的解决方案。

注意:这不是死锁,因为 Go 没有throw: all goroutines are asleep - deadlock!

0 投票
2 回答
619 浏览

concurrency - 为什么这个 Go 代码会死锁?

我对 Go 很陌生,所以任何指针都会很棒。我将如何调试这样的事情?

您可以运行代码片段http://play.golang.org/p/SCr8TZXQUE

更新:这在操场上没有线路 <-time.After(time.Duration(id)*time.Millisecond),我想知道为什么?(正如@dystroy 提到的,这可能是因为操场处理时间的方式)

当我在本地尝试时,这是输出:

所有的 goroutine 都完成了,但无论如何都会引发死锁。我应该注意,如果使用计时器并不重要,无论哪种方式都会死锁。

0 投票
1 回答
163 浏览

parallel-processing - 并行化 - 为什么睡眠只暂停一次?

为什么只等待第一个 goroutine

func Sleep(d Duration)
http://golang.org/pkg/time
“睡眠暂停当前的 goroutine 持续时间 d。”

但其余的直接执行。我认为导致渠道c chan string,但我不了解两者之间的行为。

我的示例 GoPlayground