结构方法作为具有结构成员访问权限的goroutine 这样使用方法作为goroutine有什么问题吗 如果Work()方法仅读取数据,是否需要对数据使用互斥锁 有没有更好的模式可以用来实现这种服务 2:是的。您的代码可能存在内存竞争,因为您同时读取和写入w

结构方法作为具有结构成员访问权限的goroutine 这样使用方法作为goroutine有什么问题吗 如果Work()方法仅读取数据,是否需要对数据使用互斥锁 有没有更好的模式可以用来实现这种服务 2:是的。您的代码可能存在内存竞争,因为您同时读取和写入w,go,concurrency,Go,Concurrency,结构方法作为具有结构成员访问权限的goroutine 这样使用方法作为goroutine有什么问题吗 如果Work()方法仅读取数据,是否需要对数据使用互斥锁 有没有更好的模式可以用来实现这种服务 2:是的。您的代码可能存在内存竞争,因为您同时读取和写入w.data。您无法同时安全地读取和写入相同的值。每次提取“数据”时,您需要对其执行多少次“工作”?工作循环很快,假设在10-300次迭代/秒的范围内,fetchData循环每1-15分钟运行一次。所以互斥是解决这个问题的方法?谢谢你的回答。互斥

结构方法作为具有结构成员访问权限的goroutine
  • 这样使用方法作为goroutine有什么问题吗
  • 如果Work()方法仅读取数据,是否需要对数据使用互斥锁
  • 有没有更好的模式可以用来实现这种服务

  • 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()
    }