gpt4 book ai didi

Golang 和并发/并行

转载 作者:IT王子 更新时间:2023-10-29 01:45:43 29 4
gpt4 key购买 nike

我正在研究 Golang 并遇到一个问题,我已经研究了几天,我似乎无法理解 go routines 的概念以及它们的使用方式。

基本上我是在尝试生成数百万条随机记录。我有生成随机数据的函数,并将创建一个包含此数据的巨大 .CSV 文件。

我的问题是是否有可能使这个并发并加快速度?

我的代码基本上是生成一个随机字符串,将字符串写入文件最多 N 次(其中 N 是您想要的任何值)。

我的问题是是否可以同时执行此操作以减少执行时间。似乎无论我如何处理这个问题,我仍然得到相同的基准,就好像我没有使用 go routines 一样。

这是我目前所拥有的示例:

func worker(c chan string) {
for {
c <- /* Generate random data using other functions here */
}
close(c)
}

func writer(s string) {
csvfile.WriteString(s)
}

func main(){
receive := make(chan string)

for i := 0; i < 100; i++ {
go worker(receive)
}

for i := 0; i < 10000; i++ {
go writer(<-receive)
}
}

在我生成数据的地方,我使用了大量的函数调用:https://github.com/Pallinder/go-randomdata .你认为这可能是我一直失败的地方吗?

如有任何帮助,我们将不胜感激。

最佳答案

我认为您不应该在这里尝试使用 go 例程。文件写入几乎总是原子的,你想使写入文件的机制并发......这将需要一个复杂的锁定机制,由于写入本身仍然是原子的,最终可能不会提高应用程序性能。

如果数据生成是您程序的瓶颈,那么在 go 例程中拆分该工作并从您获取所有数据的地方写入是有意义的。但是

for i := 0; i < 100; i++ {
go worker(receive)
}

for {
select {
case item := <-receive:
writer(item)
case <-abort:
cleanUp()
return
}
}

你不能在从一个 channel 接收并无休止地调用一个函数的同时循环一些 int ......你可以在一个选择中从一个 channel 接收。或者只是做 item := <-recieve这会阻塞直到读取一个项目。在我上面的示例中,我提供了一些伪代码来演示更多您的设计在这种情况下应该是什么。你需要一个中止 channel ,这样你就可以在你想要停止应用程序时退出你的例程。它可能应该完成对文件的写入,然后在返回之前将其关闭。

关于Golang 和并发/并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31250617/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com