协程与通道

进程:计算机进行资源分配调度的基本单位。且运行在自己内存空间内的独立执行体
(一个应用程序就是运行在机器上的一个进程)
线程:进程内部共享进程内存资源的多个执行体(当一个线程进行IO时,换另一个线程执行)

并行:同一个程序在某个时间点同时运行在多个处理器核心上。
并发:同一时间段内,多个线程执行任务(提高ICU的时间使用率)

协程:根据一个或多个线程的可用性,映射到线程之上(Go tuntime中调度)

同步:进程的多个线程(或者协程)中数据一致

协程工作在相同的地址空间中,所以共享内存(sync包)的方式一定是同步的。(不鼓励使用共享内存的方式来达到同步)
Go使用channels来同步协程
当系统调用(IO等待等)当前线程的当前协程被阻塞时,当前线程的其余协程会继续在其它线程上工作。
协程(特别轻量,只有4k)
协程可以运行在多个操作系统线程之间(多个线程之间来回跑。),也可以运行在线程之内(呆在一个线程上面)

两种并发方式:
确定性的(明确定义排序),Go的通道,先发送者后接收者(有先后之分)
非确定性的(加锁/互斥),Java的多线程,随机,谁抢到就是谁的
线程通过关键字go调用一个方法或函数实现(也可以时匿名函数)
在当前线程开始一个同时运行的协程。go sum(a,b)
协程的栈(自己建的)会根据需要进行伸缩,不会出现栈溢出。协程没有返回值
main() 也可以看作一个协程。
协程可以在init()(程序初始化)中运行。
runtime.Gosched()。当前协程让出处理器。


GOMAXPROCS,Go应用程序的线程数量(并行协程的最大数量,不过肯定是要小于处理器核心数的)。

如果GOMAXPROCS >= n,则这些线程会被分散到n个处理器核心上(假设计算机处理核心有n个)


在代码中指定使用的线程数
使用flags包
var numCores = flag.Int("n",2,"number of CPU cores to use")
flag.Parse()
runtime.GOMAXPROCS(*numCores)

posted on 2019-08-21 20:00  暮城暮雪  阅读(212)  评论(0编辑  收藏  举报

导航