并发
Go的作者选择了消息传递模型来作为推荐的并发编程方法。该语言同样支持共享内存,然后作者自有道理:
- 不要通过共享内存来通信,相反,通过通信来共享内存。
该语言提供了两个基本的构件来支持这一范型:goroutines和channels。
Go例程
Goroutine是轻量级的并行程序执行路径,与线程,coroutine或者进程类似。然而,它们彼此相当不同,因此Go作者决定给它一个新的名字并 放弃其它术语可能隐含的意义。
创建一个goroutine来运行名为DoThis的函数十分简单:
- go DoThis() // but do not wait for it to complete
匿名的函数可以这样使用:
- go func() {
- for { /* do something forever */ }
- }() // Note that the function must be invoked
这些goroutine将会通过Go运行时而映射到适当的操作系统原语(比如,POSIX线程)。
通道类型
有了goroutine,代码的并行执行就容易了。然而,它们之间仍然需要通讯机制。Channel提供一个FIFO通信队列刚好能达到这一目的。
以下是使用channel的语法:
- /* Creating a channel uses make(), not new - it was also used for map creation */
- ch := make(chan int)
- /* Sending a value blocks until the value is read */
- ch <- 4
- /* Reading a value blocks until a value is available */
- i := <-ch
举例来说,如果我们想要进行长时间运行的数值计算,我们可以这样做:
来源:oschina
链接:https://my.oschina.net/u/62849/blog/5331