猿问

如何确保按通道生产和消费数据是安全的

我是golang的新手,这是我的目的,我想让2个例程与一个公共频道同时运行,消费者应该在频道创建后启动并始终获取数据直到频道关闭,我的代码模板如下:


var userChannel chan string

for index := 0; index < *clientNums; index++ {

        wg.Add(1)

        go run1()

        go run2()

    }

    wg.Wait()


}


func run1() {

   defer wg.Done()

   // ...some logic

   userChannel = make(chan string, *readUserNums)

   for index := 0; index < *readUserNums; index++ {

         //...some logic

         userChannel <- userId

         //...some logic


   }

   close(userChannel)

}

func run2() {

   for sendId := range userChannel {

       //...some logic

}

}

在我的代码中,如果run2首先运行它会很恐慌,因为尚未创建通道并且通道中没有数据。我怎样才能达到我的目的?谢谢你


一只萌萌小番薯
浏览 132回答 2
2回答

守候你守候我

首先创建通道,然后将其传递到您的 goroutines 中,而不是将其存储在全局中并动态创建它。

米脂

即使userChannel最初没有数据存在,只要创建了它就不会成为问题userChannel,这里它失败了,因为没有创建通道。run1在调用或run2传递通道之前创建通道始终是最佳实践。仅供参考:如果通道是由通道上没有数据创建的,并且如果我们尝试从通道中读取数据,这将是一个阻塞调用,并且将等待直到将数据接收到等待通道中。
随时随地看视频慕课网APP

相关分类

Go
我要回答