goroutine 相关问题

goroutine是一个轻量级的执行线程,由Go语言运行时管理。

在 golang 中是否存在存在竞争条件的情况?

假设我有一段代码,该代码在布尔值上存在竞争条件,只能从 true 变为 false。例如这样的事情: 好的 := 正确 为了 { 去函数(){ 如果!好的{

回答 1 投票 0

Goroutines with time.Sleep 工作,但 WaitGroup 导致错误 - 同步问题?

我正在尝试同步2个goroutines,例如gr1和gr2交替运行。 为此,我使用 2 个通道进行协调。 当我使用 time.Sleep 等待 goroutine 完成时,它正在工作

回答 1 投票 0

为什么在函数内启动多个 Goroutine 不会产生任何输出?

我是 Golang 新手,所以正在关注(A Tour of Go. 我在代码编辑器中修改了代码如下: 包主 进口 ( “FMMT” “时间” ) func say(s 字符串) { 为...

回答 1 投票 0

为什么打印0?

我正在尝试并发,并且正在尝试一些模式。 我正在尝试这样做,您收到一组元素,同时处理它们并对所有结果求和。 我正在使用 2 茶...

回答 1 投票 0

当一个例程遇到错误时立即报告错误

我正在尝试找出在一个例程遇到错误时立即报告错误的基本模式。这是我正在使用的代码的基本逻辑 func doSomeWork(num int, 呃...

回答 1 投票 0

Golang 中的线程池,用于处理处于等待状态的 Goroutines

我想限制创建的 Goroutine 的最大数量,以避免创建太多的 Goroutine。我们可以通过使用如下所示的方法来实现相同的目的: var g errgroup.Group g.设置限制(10) 夫...

回答 1 投票 0

10000次API调用耗时太长

我正在学习并尝试Golang中的WaitGroup功能。这是我的代码: 包主 进口 ( “原子” “http” “日志” “同步” &quo...

回答 1 投票 0

使用带有sync.WaitGroup的goroutine结果不一致

我正在尝试使用 goroutine(在 Go lang 中)计算小于任意整数 i 的素数的数量。 例如,如果 i 为 100,则结果应为 25。 以下是我的c...

回答 1 投票 0

如何在golang中创建异步迭代器 - 但目前死锁

我有这个,我相信它接近按预期工作。我想做的是范围在一个序列上,但能够自己异步调用下一个项目 同步: 对于 r := 范围偶数。

回答 1 投票 0

在Go中,如何使用互斥锁与Go例程进行锁定和等待

我的代码是这样的: var 锁sync.Mutex 函数 DoSomething() { 锁.Lock() 去函数(){ 延迟锁定.Unlock() // 代码在这里 }() } 函数等待() { 锁.Lock() 锁.U...

回答 1 投票 0

Goroutine 死锁

以下 goroutine 代码返回死锁... 请帮我确定问题 包主 导入“fmt” 函数主() { // 创建并使用通道 计数器 := make(chan...

回答 1 投票 0

如何改进简单连接池以减少阻塞

我有这个简单的连接池,它似乎工作正常,但如果任何连接断开连接,它会阻止该方法的所有读取器: 类型 RabbitMQConnectionPool 结构 { ...

回答 1 投票 0

互斥体似乎没有锁定资源

我希望每当文件打开时,我的 go 例程都会从新文件中读取。为此,我使用互斥体来做到这一点。但输出似乎并没有达到预期。在 f1.txt 中我有 h...

回答 1 投票 0

工作池使用通道停止的恐慌

我正在编写一个工作线程池实现,在停止工作线程时遇到了问题。在运行 for _,worker := range p.workers {...} 循环后,我立即感到恐慌。我开始...

回答 1 投票 0

追加不是线程安全的?

我注意到,如果我尝试在 for 循环内使用 goroutine 附加到切片,则会出现丢失/空白数据的情况: destSlice := make([]myClass, 0) var wg 同步.WaitG...

回答 5 投票 0

如何确保通道读取不会超过选择中的任何其他情况

我有这两个功能: pointQueue = make(chan *mongo.UpdateOneModel, 1000) func UpdatePoints(用户名字符串,大小 int64) { 点差 := -1 * 大小 更新 := bson.D{{"$inc&q...

回答 1 投票 0

GoLang,确保通道读取不会超过选择中的任何其他情况

我目前有这两个功能 pointQueue = make(chan *mongo.UpdateOneModel, 1000) func UpdatePoints(用户名字符串,大小 int64) { 点差 := -1 * 大小 更新 := bson.D{{&...

回答 1 投票 0

为什么 Go 例程会这样?

我正在读一本叫做《Go in action》的书,我对书中的 goroutine 部分感到有点困惑,基本上我想了解以下代码的两件事: 包主 进口 ( &

回答 1 投票 0

mongodb客户端驱动并发安全吗?

在代码库中的以下代码中,创建了 mongodb 客户端(如下所示): 进口 ( “语境” “时间” “go.mongodb.org/mongo-driver/mongo” “去吧...

回答 2 投票 0

使用通道将数据从一个 Goroutine 传递到另一个 Goroutine 的问题

我开发了以下内容: 包主 导入“fmt” 导入“时间” 函数添加(n int){ ch :=make(chan int) 总和:=0 对于我:= 0;i 我开发了以下内容: package main import "fmt" import "time" func add ( n int){ ch :=make(chan int) sum :=0 for i:= 0;i<n;i++{ sum = sum+i } ch <- sum fmt.Println("Sum is",sum) } func display(ch1 chan int){ fmt.Println("Sum is now",ch1) } func main() { ch2 :=make(chan int) go add(10) go display(ch2) fmt.Println("Hello World!") time.Sleep(time.Second) } 我想将当前总和传递到函数显示。 但是,当我打印总和时,我在控制台中收到以下消息: 世界你好! 现在总和是 0xc000094060 请帮忙打印当前金额。 您不是打印通道中的值,而是打印通道! 尝试: package main import "fmt" import "time" func add (ch chan int, n int){ sum :=0 for i:= 0;i<n;i++{ sum = sum+i } ch <- sum fmt.Println("Sum is",sum) } func display(ch chan int){ fmt.Println("Sum is now", <-ch) } func main() { ch :=make(chan int) go add(ch, 10) go display(ch) fmt.Println("Hello World!") time.Sleep(time.Second) } 另外,为什么要在 goroutine 中运行 display 呢? 如果你在 add 中做了一些复杂的事情并且花费的时间超过 1 秒,那么这个应用程序将停止并且不执行任何操作。也许看看等待组。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.