goroutine
有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。类比现实生活中的例子有十字路口被各个方向的的汽车竞争;还有火车上的卫生间被车厢里的人竞争。 上面的代码中我们开启了两个goroutine去累加变量x的值,这两个goroutine在访问和修改x变量的时候就会存在数据竞争,导致最后的结果与期待的不符
go语言中的Mutex Golang以其并发性Goroutines而闻名。不仅是并发,还有更多。 因此,在这种情况下,我们必须确保多个goroutines不应该同时试图修改资源,从而导致冲突
注意,原文发布日期为2017年5月3日,至今已有3年 , 而 go 语言已然从 1.10 进化到了 如今的 1.14 所以本篇的内容时效性并不做保证,仅用以学习理解。 事实上,操作系统运行线程,也就是你的代码所运行的地方。 Go 做的 “把戏” 就是,使用编译器把不同系统的系统调用注入 go 的 runtime 内, 所以 Go 可以响应调度器并且执行动作
对于大部分应用,尽可能快地响应请求是首要任务。例如,应用程序可能正在服务用户的HTTP请求,或者检索复制的数据块。 在这些情况下,你需要做出权衡:是将请求复制到多个处理程序(无论是goutoutine,进程还是服务器),并且其中一个将比其他处理程序返回更快呢,还是立即返回结果——缺点是必须考虑如何高效利用资源来保持处理程序的多个副本同时运行
Golang的sync的包有一个并发原语WaitGroup,在日常开发中比较的有用。 WaitGroup的用途:它能够一直等到所有的goroutine执行完成,在其期间会会阻塞主线程的执行,直到所有的goroutine执行完成。 这里要注意一下,在其中的多个goroutine 的执行结果是没有顺序的,调度器不能保证多个 goroutine 执行次序,且进程退出时不会等待它们结束
原文在此。遗憾的是文章只提出了问题,并没明确提供如何解决这些问题。但无论如何,对于这种可以引起反思的文章,是不能放过的
