问题标签 [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 投票
4 回答
2019 浏览

go - 并发 Goroutines 的互斥

在我的代码中有三个并发例程。我尝试简要概述我的代码,

我想要这样,当两个之间的代码做某事(两个星号之间的代码)正在执行时,控制流不能转到其他 goroutines。例如,当例程 1 正在执行两颗星之间的事件(发送和打印事件)时,例程 2 和 3 必须被阻塞(意味着执行流程不会从例程 1 传递到例程 2 或 3)。完成最后一个打印事件后,执行流程可能会转到例程 2 或 3。任何人都可以通过指定来帮助我,我该如何实现?是否可以通过WaitGroup实现上述规范?任何人都可以通过给出一个简单的例子来告诉我如何使用 WaitGroup 来实现上述指定的例子。谢谢。

注意:我给出了两个发送和两个打印选项,实际上有很多发送和打印。

0 投票
1 回答
321 浏览

go - 相互并发的 Go 例程中的死锁错误

我有三个并发的 go 例程,如下所示,

这个逻辑代码每次都会出现死锁情况。实际上,当它运行时,只需执行例程1的打印语句(*标记之间的语句)多次(尽管我的打印语句只有一个)并给出死锁错误。谁能告诉我代码逻辑有什么问题。谢谢。

注意。有关更多信息,可以在此处找到代码http://play.golang.org/p/pW6aXryUaK,其中仅执行第 290 行。没有错误的原始代码可以在这里找到 play.golang.org/p/UL3rj8DJRk。我只是为他们添加锁定和解锁。谢谢。

我想补充一点:在 play.golang.org/p/UL3rj8DJRk 的代码中,您可以找到各种打印语句的输出,如下所示:process [number] 在 [time nano seconds] 发送 [int] to process [number] ]。但是,由于三个并发例程的结果,有时打印语句没有正确执行(意味着没有打印整个,有一些东西被另一个打印插入,例如进程 [number] 发送 [int] 到进程 [number] 处的进程 [number] ])。任何机构都可以帮我解决这个问题吗?

0 投票
1 回答
711 浏览

go - Go 中并发例程的打印问题

我有三个这样的并发例程,

现在我面临的问题是,有时会发生这样的情况,由于三个并发例程,有时打印语句没有正确执行意味着没有打印整个,有一些东西被另一个打印插入。例如,例程 1 的 Print (value a, value b, value c) 给出的输出类似于值 a、值 b、值 g,其中值 g 是由例程 2 插入的。有人可以建议我,我该如何阻止它?我已经尝试过同步互斥程序。但是可能是因为我的代码太长并且可能我无法以正确的方式进行锁定解锁,所以它给出了死锁错误。任何人都可以建议我如何以简单的方式或风险较小的同步互斥程序实现这些。

关于我的这个问题的更多信息可以在这里找到。

0 投票
2 回答
254 浏览

concurrency - 并发 Go 例程的相互执行问题

在我的代码中有三个并发例程。我尝试简要概述我的代码,

我想要这样,当两个之间的代码做某事(两个星号之间的代码)正在执行时,控制流不能转到其他 go 例程。例如,当routine1正在执行两颗星之间的事件(发送和打印事件)时,必须阻塞例程2和3(意味着执行流程不会从例程1转到例程2或3)。完成最后一个打印事件后,执行流程可能会传递给例程 2 或 3。任何人都可以通过指定来帮助我,我该如何实现?是否可以通过 WaitGroup 实现上述规范?任何人都可以通过给出一个简单的例子来告诉我如何使用 WaitGroup 来实现上述指定的例子。谢谢。

注意:可能这是重复的问题。但是,我尝试使用该同步锁定机制,这可能是因为我的代码很大,这就是为什么我无法正确放置锁定解锁的原因,并且它正在造成死锁情况(或者可能是我的方法产生错误)。任何人都可以通过一个简单的程序帮助我,这样我就可以做到这一点。我在这里给出了我的代码的一个简单示例,在这里我想在互斥锁中放置两个打印和发送事件(对于例程 1),因此例程 2 不能中断它。你能帮助我怎么可能。给出了一种可能的解决方案, http ://play.golang.org/p/-uoQSqBJKS给出了错误。

0 投票
7 回答
85269 浏览

go - 最大 goroutine 数

我可以无痛使用多少个 goroutine?例如,维基百科说,在 Erlang 中可以创建 2000 万个进程而不会降低性能。

更新:我刚刚对 goroutines 的性能进行了一些调查,得到了这样的结果:

  • 看起来 goroutine 的生命周期超过了计算 sqrt() 1000 次(对我来说约为 45µs),唯一的限制是内存
  • Goroutine 花费 4 — 4.5 KB
0 投票
2 回答
196 浏览

synchronization - 同步频道?

假设我正在使用以下三种方法解析某种输入:

它们都解析相同输入的某个部分并将其返回为[]byte,因此它们可以像这样使用:

现在我想通过使用通道使这 3 个进程并行。我的想法是将通道传递给这些函数以供它们写入,但是我如何确保它们以正确的顺序写入通道?(即body在header之后写入channel,在body之后写入footer )

0 投票
6 回答
42895 浏览

go - 如何最好地保持一个长时间运行的 Go 程序运行?

我有一个用 Go 编写的长时间运行的服务器。Main 触发了几个执行程序逻辑的 goroutine。在那之后, main 没有任何用处。一旦 main 退出,程序将退出。我现在用来保持程序运行的方法只是对 fmt.Scanln() 的简单调用。我想知道其他人如何阻止 main 退出。下面是一个基本的例子。这里可以使用哪些想法或最佳实践?

我考虑过创建一个通道并通过在所述通道上接收来延迟 main 的退出,但我认为如果我所有的 goroutine 在某个时候都变得不活动,这可能会出现问题。

旁注:在我的服务器(不是示例)中,程序实际上并没有连接到外壳运行,因此无论如何与控制台交互都没有意义。现在它有效,但我正在寻找“正确”的方式,假设有一个。

0 投票
1 回答
994 浏览

go - goroutine channels - send 语句的值

当我尝试打印时:

下面代码块中的 for 循环之前查看“c <- x”将评估为什么,它收到了错误消息:

./select.go:7: 发送语句 c <- x 用作值;使用 select 进行非阻塞发送

如果发送操作成功,“c <- x”是否被评估为真?为什么 Go 只允许你在 select 语句中的 case 语句中使用 send 语句的值(也就是 "c <- x" 的值)?

谢谢

0 投票
2 回答
1470 浏览

concurrency - 打印到标准输出会导致阻塞的 goroutine 运行?

作为一个愚蠢的基本线程练习,我一直在尝试在 golang中实现睡眠理发师问题。有了频道,这应该很容易,但我遇到了一个 heisenbug。也就是说,当我尝试诊断它时,问题就消失了!

考虑以下。该main()函数将整数(或“客户”)推送到shop通道上。barber()阅读shop频道为“客户”剪头发。如果我fmt.Print在函数中插入一条语句customer(),程序会按预期运行。否则,barber()永远不要剪别人的头发。

知道发生了什么吗?

0 投票
2 回答
19680 浏览

go - 如何在并发 goroutine 期间锁定/同步对 Go 中变量的访问?

在他对这个问题的回答中: Golang for Windows 不稳定的行为? 用户@distributed 建议在并发 goroutine 上锁定/同步对共享变量的访问。

我怎样才能做到这一点?

更多关于这个问题:

views我同时在多个 goroutine上运行此代码(返回的带有闭包的函数):

看起来 IO 函数需要时间,结果我得到了这种输出:

它递增得很好,但是当它被打印出来时,我可以看到打印+递增操作根本不是原子的。

如果我将其更改为:

它似乎工作正常,但我不完全确定它是否最终不会失败......