协程(用户态线程)

协程(用户态线程)


文章目录

  • 协程(用户态线程)
    • 协程
    • 对比线程
    • 多线程一定快吗?
    • 并发和上下文切换
    • 协程的艺术
    • 演示
    • 总结


协程

首先什么是协程?有人认为进程下有线程,线程管理着协程.其实这并不对
协程是一种用户态线程.它比线程更加轻量并且协程对于操作系统是并不可见的.
也就是说操作系统看不见协程
同一时刻一个CPU只会执行一个协程.
比如交给协程去执行的代码你可以理解为一个个提交的任务

对比线程

那什么是线程?
线程是进程的一个实体,是CPU调度和分派的基本单位.线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。
创建一个线程每个线程都有自己的TCB都有自己的堆栈.创建一个线程是有很大的花销的
也就是说一台服务器的资源总是有限的,你不可能无休止的去开线程(总有一天你会把内存占完)
默认创建一个线程的大小是1MB(取决于实现)也就是说4G的内存 最多只能创建4096个
但是很多时候我们创建的一个线程用不了这么多内存空间
线程的平均内存空间利用率是很低的
那可能有很多人写过这样的一个程序. 是一个基于Socket聊天的程序.大部分人是这样做的来一个Socket以后为其开一个线程工作.这样小程序的时候貌似没有什么问题
但是只要程序一大可能计算机资源就被分配光了. 更好的做法应该是像Reactor模式一样(有兴趣的可以去看一下).使用IO多路复用.反应器模式的效率会高很多

多线程一定快吗?

有的人一说到多线程就觉得多线程开越多程序用行越好.其实并不是的
多线程的创建和销毁都有一定的开销(更好的方式是线程池和任务队列)
有时候多线程并不如串行化快(一会说).
确实有些场景下多线程会比单线程快 比如:返回一个页面,这个页面可能是图文并茂.你经常看到的一个场景是文字先全部出来然后是图片加载出来.因为文字是很快的,而

你可能感兴趣的:(多线程,Golang,协程,Go协程,多线程,协程和多线程)