寶慕林4294392
2021-10-18 16:59:44
我正在深入 Golang 并且有一個問題,我已經(jīng)研究了幾天,我似乎無法掌握 goroutines 的概念以及它們是如何使用的?;旧衔沂?,試圖生成數(shù)百萬條隨機記錄。我有生成隨機數(shù)據(jù)的函數(shù),并將創(chuàng)建一個包含這些數(shù)據(jù)的巨大 .CSV 文件。我的問題是是否有可能使這個并發(fā)并加快速度?我的代碼基本上是生成一個隨機字符串,將字符串寫入文件最多 N 次(其中 N 是您想要的任何內(nèi)容)。我的問題是是否可以同時執(zhí)行此操作以減少執(zhí)行時間。似乎無論我如何處理這個問題,我仍然得到相同的基準測試,就好像我沒有使用 go 例程一樣。這是我到目前為止所擁有的示例: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) }}在我生成數(shù)據(jù)的地方,我使用了大量來自https://github.com/Pallinder/go-randomdata的函數(shù)調(diào)用。你認為這可能是我一直在失去的地方嗎?任何幫助,將不勝感激。
2 回答

揚帆大魚
TA貢獻1799條經(jīng)驗 獲得超9個贊
我認為您不應該在這里嘗試使用 go 例程。文件寫入幾乎總是原子的,您希望使寫入文件的機制并發(fā)......這將需要一個復雜的鎖定機制,由于寫入本身仍然是原子的,因此最終可能不會提高應用程序性能。
如果數(shù)據(jù)生成阻礙了您的程序,那么將這些工作拆分到 go 例程中并從您獲取所有數(shù)據(jù)的地方開始編寫是有意義的。但
for i := 0; i < 100; i++ {
go worker(receive)
}
for {
select {
case item := <-receive:
writer(item)
case <-abort:
cleanUp()
return
}
}
您不能在從通道接收并無休止地調(diào)用函數(shù)時循環(huán)一些 int ……但是您可以在選擇中從通道接收?;蛘咧皇峭ㄟ^這樣做item := <-recieve會阻塞,直到讀取一項。在我上面的示例中,我提供了一些偽代碼來更多地演示在這種情況下您的設計應該是什么。您需要一個中止通道,以便在您想停止應用程序時可以退出 go 例程。它可能應該完成對文件的寫入,然后在返回之前關閉它。
- 2 回答
- 0 關注
- 203 瀏覽
添加回答
舉報
0/150
提交
取消