我有大量的目录,每个目录都包含数百到数千个文件.我想遍历目录列表.然后 for each 目录调用Go routine ,该 routine 将扫描目录中的文件,并将每个文件的路径添加到作业(job)队列,以供一组要处理的作品使用.
这就是我到目前为止所拥有的:
type AppConfig struct {
UploadPath string `mapstructure:"upload_path"`
LocalPath string `mapstructure:"local_path"`
Bucket string `mapstructure:"bucket"`
}
func consumer(i int, jobs <-chan *ops.Job) {
defer wg.Done()
for job := range jobs {
fmt.Printf("Worker: %v is processing file: %v\n", i, job.Work)
}
}
func producer(jobs chan<- *ops.Job, filesToTransfer []string) {
for i, file := range filesToTransfer {
jobs <- &ops.Job{Id: i, Work: file}
}
}
func main() {
var (
appconfigs map[string]*ops.AppConfig
wg *sync.WaitGroup
)
jobs := make(chan *ops.Job)
// setting up workers
for i := 0; i < 10; i++ {
wg.Add(1)
go consumer(i, jobs)
}
// adding jobs
for _, values := range appconfigs {
filesToTransfer := ops.ScanUploadPath(values.LocalPath)
go producer(jobs, filesToTransfer)
}
go func() {
wg.Wait()
close(jobs)
}()
}
之前,当我在producer函数中调用close(jobs)时,我在关闭通道问题上遇到了死锁和panic .我读到我应该把这个放在我的main()号上:
go func() {
wg.Wait()
close(jobs)
}()
我真的不明白为什么我需要在我的producer之外还有一个单独的围棋程序.我希望有人能解释一下原因.