码迷,mamicode.com
首页 > 编程语言 > 详细

Go 语言并发笔记

时间:2015-10-01 09:13:37      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请注明出处!

1. Goroutine

  - 定义: 在语言级别上支持的轻量级线程.  

  - Go标准库提供的所有操作系统调用操作(包括同步I/O操作), 都会让出处理机给它. 所以它的切换和管理不依赖于系统的进程和线程

  - 是go语言库的功能 , 而不是操作系统的功能. Goroutine不是用线程实现的. 本质是一段代码, 一个函数入口, 以及在堆上为其分配的一个堆栈. 

  - 省去了频繁创建和销毁线程的开销, 可以创建上百万个Goroutine, 但是它们并不是直接被操作系统调度. 

  - 其他语言一般通过库的方式支持协程, 但是在这种协程中调用一个同步IO操作,比如网络通信, 本地文件读写都会阻塞其他并发执行的协程.

  - 创建方式: 在一个函数前面加上 go 关键字, 这次调用就会在一个新的Goroutine中并发执行, 直到函数返回.( 注: 函数返回值会被丢弃)

 

2. Channel

  - 定义 : Go 采用消息机制作为并发单位之间的通信手段. 

  - 每个并发单位是自包含的, 独立的个体, 并且都有自己的变量. 这些变量不能在不同的并发单位之间共享.

  - 类似Pipe, 可以使用Channel在两个或多个Goroutine之间传递消息,  Channel在设计上确保同一时刻只有一个Goroutine能从中接收数据. 从而避免使用互斥锁的问题.

  - Channel的发送和接收都是原语操作, 不会中断, 只会失败.

  - Channel是进程内的通信方式, 进程间通信一般采用分布式的方法, 如: Socket 或者HTTP等.

  - 声明和初始化:   var channelName chan ElementType  ElementType 指定Channel所能传递的元素类型.

 

3. 数据的接收和发送

  - 使用Channel在不同的Goroutine中传递数据. 使用通道运算符号:  <- 

  - 发送  channelVar <- value 

  - 接收  value := <- ch 

  - 向Channel写入数据会使  程序(应该是Goroutine吧)阻塞, 知道有其他的Goroutine从这个Channel中读取数据.

  - 如果Channel之前没有写入数据, 那么从Channel中读取数据也会阻塞  程序(应该是Goroutine吧), 直到有写入数据为止.

技术分享
package main

import(
    "fmt"
    "math/rand"
)

func Test(ch chan int){
        // 不明白结果中为什么有的End没有输出来?
    fmt.Println("Begin...",ch)
    ch <- rand.Int()
    fmt.Println("End ...",ch)
}

func main() {
    chs := make([]chan int,10)
    for i := 0;i<10;i++ {
        chs[i] = make(chan int)
        go Test(chs[i])
    }
    for _,ch := range chs{
        value := <- ch
        fmt.Println(value)
    }
}
View Code

 

Go 语言并发笔记

标签:

原文地址:http://www.cnblogs.com/roger9567/p/4850629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!