2017-08-17 116 views
0

我有一个工作应该处理作业,并在这名工作人员有数据库读写,日志文件,接收API和一些数据计算。避免与golang数据竞争工人

var mystruct strcut{} 

func worker(v) { 
    Get data from database 
    ... 
    Update database status 
    ... 
    useByWorker() 
    ... 
    Do some computing 
    ... 
    Receive API 
    ... 
    Write log file 
} 

func useByWorker() { 
    mystruct = {1,2,3} 
} 

这是我的主要func运行员工。

func main() { 
    var wg sync.WaitGroup 
    data := [][]string{} 
    wg.Add(1) 
    for k,v := range data { 
     k := k 
     v := v 
     go func(k int, v []string) { 
      fmt.Println(k,v) 
      worker(v) 
      wg.Done() 
     }(k, v) 
    } 

    wg.Wait() 
} 

数据竞争问题让日志和我在工作中使用的数据混淆起来。任何方式都可以简单地修复数据竞争问题而无需锁定(Mutex.Lock)。我希望工作能够更快地被工人处理。

任何建议或提示将有所帮助。谢谢。

+2

您在'main'中使用WaitGroup是可疑的 - 您只需调用'Add(1)'一次,然后在goroutine中多次调用'Done'(对于'data'中的每个元素)。 – ain

+0

“我希望工作能够更快地被工人处理。” ---你真的认为几纳秒会让你的代码变慢吗? – zerkms

+0

等待API或数据库响应时消耗的时间。这个问题的主要问题是,我应该如何在没有数据竞争的情况下同时独立完成这些工作。 – Weiwei

回答

1

如果您想要对文件进行非阻塞式写入访问,则可以使用一个goroutine在通过通道传递消息的文件中进行写入。可以通过使用Channel Buffering 或者您可以使用standard logger来避免块。它可以与多个goroutines一起工作。