GO语言学习笔记-互斥锁
原文,互斥锁(Mutex)也是go并发系列最后一篇文章。
临界区
在说互斥锁前,理解并发编程中的临界区(Critical section)是十分重要的。当一个程序并发执行时,共享资源不应该在同一时刻被多个goroutine修改。这段修改共享资源的代码就叫做临界区。举个例子,我们有一个代码片段用于修改变量x自增1。
x = x+1
如果上面的代码在唯一的goroutine中执行,不会有任何问题。
原文,互斥锁(Mutex)也是go并发系列最后一篇文章。
在说互斥锁前,理解并发编程中的临界区(Critical section)是十分重要的。当一个程序并发执行时,共享资源不应该在同一时刻被多个goroutine修改。这段修改共享资源的代码就叫做临界区。举个例子,我们有一个代码片段用于修改变量x自增1。
x = x+1
如果上面的代码在唯一的goroutine中执行,不会有任何问题。
select
语法用来从多个读/写的channel中选择一个,如果没有任何channel就绪select语句将被阻塞。如果多个就绪,则随机选择一个。语法和switch
类似,除了case后面跟随的是channel。
原文,这里为了方便理解我把worker pools翻译成线程池。
之前讨论的所有channel都是不带缓冲区的,因此读取和写入都会被阻塞。创建一个带缓冲区的channel也是可能的,这种channel只有在缓冲区满后再写入或者读取一个空的channel时才会被阻塞。
创建一个带缓冲区的channel需要一个额外的参数容量来表明缓冲区大小:
ch := make(chan type, capacity)
上面代码中的 capacity 需要大于0,如果等于0的话则是之前学习的无缓冲区channel。
原文,建议先看完goroutine部分再看这篇。
channels可以理解成是goroutine之间通信的管道,和水流从管道的一端到另一端类似,数据也可以从管道的一端发送另一端接收。
原文,建议理解并发(concurrency)、并行(parallelism)区别后再看这方面的内容。
Goroutines是一个可以和其他函数或方法并发执行的函数或方法。也可以把它理解为轻量级的线程(roy注:这话听起来和大python中的协程很像啊!),而创建Goroutine的开销却远远小于线程。因此在大多数的Go程序都可以并发执行成千上万的Goroutine。
分布式系统中有个经典的CAP理论,就是说任何分布式系统最多满足一致性(Consistency),可用性(Availability),分区容错性(Partition Tolerance)这三者中的两个。
既然是分布式,必然将节点部署到不同的网络中,而这则会引起一致性问题。想解决一致性,就需要保证每次操作所有节点都成功执行,而这又会降低可用性。既然分区已经是事实,所以工程上应该尽量在保证一致性的前提下提高可用性。
而一致性又可以分为: