使用方法调用与通道
Use of method calls vs channel
我越来越熟悉 Go 的并发模式,我想阐明最佳实践。
- 我了解我们想使用渠道进行沟通
在协程之间。话虽如此,在某些情况下结构
方法调用有意义或通道将被使用 in every
情况?
- 在传递已处理的消息/结构时
(不是传递/注册的模块等)传递更好吗
它们按值排序,这样我们就不会冒险让两个 goroutines 修改
同时?
您不能使用方法调用或函数调用与另一个 goroutine 通信。当您从 goroutine 调用函数时,该函数在调用它的 goroutine 中执行。您只能使用通道与另一个 goroutine 通信,或者通过共享内存和使用 sync 包中的同步原语来防止竞争条件。
问题的第二部分视情况而定
g1:
y:=<-ch
g2:
ch<-x
在上面的场景中,g1 和 g2 是独立的 goroutine。比如,g2 将值(不是指针)x 发送给 g1。然后 g1 得到 x 的副本,两个 goroutines 都可以在他们的副本上工作。如果 x 是一个指针,那么 g1 得到一个指向 x 的指针,然后 g1 和 g2 必须协调访问该指针指向的值指针。
所以,如果g2发送给g1后没有读取或修改值x,那么发送指针就可以避免复制。
我越来越熟悉 Go 的并发模式,我想阐明最佳实践。
- 我了解我们想使用渠道进行沟通 在协程之间。话虽如此,在某些情况下结构 方法调用有意义或通道将被使用 in every 情况?
- 在传递已处理的消息/结构时 (不是传递/注册的模块等)传递更好吗 它们按值排序,这样我们就不会冒险让两个 goroutines 修改 同时?
您不能使用方法调用或函数调用与另一个 goroutine 通信。当您从 goroutine 调用函数时,该函数在调用它的 goroutine 中执行。您只能使用通道与另一个 goroutine 通信,或者通过共享内存和使用 sync 包中的同步原语来防止竞争条件。
问题的第二部分视情况而定
g1:
y:=<-ch
g2:
ch<-x
在上面的场景中,g1 和 g2 是独立的 goroutine。比如,g2 将值(不是指针)x 发送给 g1。然后 g1 得到 x 的副本,两个 goroutines 都可以在他们的副本上工作。如果 x 是一个指针,那么 g1 得到一个指向 x 的指针,然后 g1 和 g2 必须协调访问该指针指向的值指针。
所以,如果g2发送给g1后没有读取或修改值x,那么发送指针就可以避免复制。