gpt4 book ai didi

使用 channel 进行执行控制的 GO 代码

转载 作者:行者123 更新时间:2023-12-01 22:22:04 24 4
gpt4 key购买 nike

我从一个长的红移表中提取所有数据 block ,每个 block 到一个 csv 文件。我想控制在“同一”时间(同时)创建多少个文件,即如果整个过程将创建 10 个文件,我想,比如说,创建 4 个文件,等到它们被创建并且一旦它们“完成”,再创建 4 个,然后创建剩下的 2 个。
如何使用 channel /秒来实现这一点?
我试图将以下 slice 更改为 channel ,但我无法让它像我所说的那样工作,我所做的实现,在创建以下文件之前没有等待/停止前 4 个文件结束。
现在我正在使用 WaitGroup 执行以下操作:

package, imports, var, etc...

//Inside func main:

//Create a WaitGroup
var wg = sync.WaitGroup{}

//Opening the connection
db, err := sql.Open("postgres", connStr)
if err != nil {
panic(err.Error())
}
defer db.Close()

//Define chunks using a slice
chunkSizer := Slicer(totalRowsInTable, numberRowsByChunk) // e.g. []int{100, 100, 100... 100}

//Iterating over the array
for index, value := range chunkSizer {
wg.Add(1)
go ExtractorToCSV(db, queriedSection, expFileName)

if (index+1)% 4 == 0 { // <-- 4 is the maximum number of files created at the "same" time
wg.Wait()
}

wg.Wait() // <-- waits for the remaining files (last 2 in this case)

}

//Outside main
func ExtractorToCSV(db *sql.DB, queryToExtract, fileName string) {
//... do its process
wg.Done()
}
我尝试使用我想要停止的大小的缓冲 channel (在这种情况下为 4),但我没有正确使用它,我不知道......
提前致谢。

最佳答案

更新 - 停止条件
您可以像这样使用 channel 来保存下一行代码。这是我为您编写的最少代码。随心所欲地调整它

var doneCh = make(chan bool)

func main() {
WRITE_POOL := 4

for index, val := range RANGE {
go extractToFile(val)

if (index + 1) % WRITE_POOL == 0 {
// wait for doneCh to finish
// if the iteration is divisive of WRITE_POOL
<-doneCh
<-doneCh
<-doneCh
<-doneCh
} else if index == MAX - 1 {
// wait for whatever doneCh left to finish
// if current val is the last one
LEFT := MAX - index - 1
for i := 0; i < LEFT; i++ {
<-doneCh
}
}
}
}

func extractToFile(val int) {
os.Create(fmt.Sprintf("test-%d", val))
doneCh<-true
}
为了获得更好的性能,请尝试:
  • 创建数据 channel 到主函数可以将数据发送给它,ExtractorToCSV 可以接收它。
  • 创建ExtractorToCSV作为goroutine并从数据 channel 读取,ExtractorToCSV完成后,发送数据到doneCh
  • 发送 db数据到数据 channel ,在 ExtractorToCSV 完成写入文件后,将 true 发送到 doneCh。

  • 如果您需要更多示例,我将更新此帖子。

    关于使用 channel 进行执行控制的 GO 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62613034/

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