go 并发编程(2)

协程

  执行体是个抽象的概念,在操作系统层面有很多个概念与之对应,如操作系统自己掌管的进程(process),进程内的线程(thread),以及进程内的协程(coroutine,也叫轻量级线程).与传统的线程和进程比,协程的最大优势在于其"轻量级",可以轻松创建上百万而不导致系统资源耗尽,而线程和进程通常最多不能超过一万个,这也是协程叫轻量级线程的原因.

  Go语言在语言级别支持轻量级线程,叫goroutine,Go语言标准库提供的所有系统调用操作,都会出让CPU给其他goroutine,这让轻量级线程的切换不依赖于系统的线程和进程,也不依赖于CPU的核心数量.

  go语言执行机制:

   go程序从初始化main package并执行main()函数开始,当main()函数返回时,程序退出,且程序并不等待其他goroutine(非主goroutine)结束.

     要让主函数等待所有的goroutine退出后再返回,如何知道所有的goroutine都退出了呢?这就引出了多个goroutine之间通信的问题.

  并发通信:

   常见两种并发通信模型:

    共享数据是指多个并发单元分别保持对同一个数据的引用,实现对该数据的共享.被共享的数据可能有多种形式,比如内存数据块,磁盘文件,网络数据等.常用内存共享.

    消息机制认为每个并发单元是自包含的,独立的个体,并且都有自己的变量,但在不同并发单元间这些变量不同享.每个并发单元的输入和输出只有一种,那就是消息.有点类似进程的概念,每个进程不会被其他进程打扰,它只做好自己的工作就可以了,不同进程间靠消息来通信,他们不会共享内存.

    go 语言提供的消息通信机制被称为channel.

上一篇:多线程:pthread_exit,pthread_join,pthread_self


下一篇:SQL Server进阶(十)事务和并发处理