结构方法作为具有结构成员访问权限的goroutine 这样使用方法作为goroutine有什么问题吗 如果Work()方法仅读取数据,是否需要对数据使用互斥锁 有没有更好的模式可以用来实现这种服务 2:是的。您的代码可能存在内存竞争,因为您同时读取和写入w
结构方法作为具有结构成员访问权限的goroutine结构方法作为具有结构成员访问权限的goroutine 这样使用方法作为goroutine有什么问题吗 如果Work()方法仅读取数据,是否需要对数据使用互斥锁 有没有更好的模式可以用来实现这种服务 2:是的。您的代码可能存在内存竞争,因为您同时读取和写入w,go,concurrency,Go,Concurrency,结构方法作为具有结构成员访问权限的goroutine 这样使用方法作为goroutine有什么问题吗 如果Work()方法仅读取数据,是否需要对数据使用互斥锁 有没有更好的模式可以用来实现这种服务 2:是的。您的代码可能存在内存竞争,因为您同时读取和写入w.data。您无法同时安全地读取和写入相同的值。每次提取“数据”时,您需要对其执行多少次“工作”?工作循环很快,假设在10-300次迭代/秒的范围内,fetchData循环每1-15分钟运行一次。所以互斥是解决这个问题的方法?谢谢你的回答。互斥
2:是的。您的代码可能存在内存竞争,因为您同时读取和写入
w.data
。您无法同时安全地读取和写入相同的值。每次提取“数据”时,您需要对其执行多少次“工作”?工作循环很快,假设在10-300次迭代/秒的范围内,fetchData循环每1-15分钟运行一次。所以互斥是解决这个问题的方法?谢谢你的回答。互斥足够使内存访问安全。如果要对事件顺序的任何逻辑进行编码,则应使用通道将数据从fetchData
发送到Work
。
type Worker struct {
data string
}
func (w *Worker) fetchData() {
for {
// sleep for defined period of time
// fetch the data
w.data = fetched_data
}
}
func (w *Worker) Work() {
go w.fetchData()
for {
// do some work that reads w.data
}
}
func main() {
worker := Worker{"data"}
worker.Work()
}