【技术分析】,的调度器与线程的区别?

【技术分析】,的调度器与线程的区别?

1 什么是协程?

协程是运行程序的一种方式数据报告,即多个函数在单个线程中同时执行。

协程是一个可以暂停执行(yield)直到给定的 YieldInstruction 完成的函数。

我的简单理解是,协程中的一个函数如果在执行过程中遇到I/O密集型任务,就会被给定的YieldInstruction(yield指令)挂起,执行权交给其他函数。继续执行直到给定的 YieldInstruction 结束。

2 协程与线程的区别由于协程的特性,它适合执行大量I/O密集型任务,而线程在这方面比协程弱。协程涉及函数切换,多线程涉及线程切换,所以有执行上下文,但是协程不受操作系统内核管理,而是完全由程序控制(即在用户态执行),这样做的好处就是性能有了很大的提升,不像线程那样需要内核态的上下文切换来消耗资源,所以协程的开销远小于同时线程的开销。在多核处理器的环境下,可以并行多线程,但运行协程的功能却不行。只能有一个,其他协程的功能全部挂起,也就是协程是并发的。由于协程在同一个线程中地图场景,因此不需要诸如互斥之类的同步原语来保护临界区。锁、信号量等,并且不需要操作系统的支持协程之间的切换不需要涉及任何系统调用或任何阻塞调用通常线程是抢占式的(即由操作系统分配执行权),而协程是程序分配执行权的原则 3 协程 不需要诸如互斥之类的同步原语来保护关键部分。锁、信号量等,并且不需要操作系统的支持协程之间的切换不需要涉及任何系统调用或任何阻塞调用通常线程是抢占式的(即由操作系统分配执行权),而协程是程序分配执行权的原则 3 协程 不需要诸如互斥之类的同步原语来保护关键部分。锁、信号量等,并且不需要操作系统的支持协程之间的切换不需要涉及任何系统调用或任何阻塞调用通常线程是抢占式的(即由操作系统分配执行权)unity 多次执行协程,而协程是程序分配执行权的原则 3 协程

unity 协程获取 imge_unity 等待协程结束_unity 多次执行协程

当IO阻塞发生时,由协程的调度器调度。通过立即yield数据流(主动yield),并将数据记录在当前栈上,阻塞后立即通过线程恢复栈,将阻塞的结果放到这个线程中运行,这样看来这与编写同步代码没有什么不同。这整个过程可以称为协程,协程中运行的负责调度的线程称为Fiber。例如,Golang 中的 go 关键字实际上负责打开一个 Fiber 并让 func 逻辑在其上运行。

由于协程的暂停完全由程序控制,所以发生在用户态;而线程的阻塞状态由操作系统内核切换,发生在内核态。

unity 协程获取 imge_unity 等待协程结束_unity 多次执行协程

因此,协程的开销远小于线程的开销,而且在 ContextSwitch 上没有开销。

4 协程的应用场景

unity 等待协程结束_unity 多次执行协程_unity 协程获取 imge

协程的应用场景主要是:I/O密集型任务。

这有点类似于多线程,但是协程调用是在一个线程中进行的,也就是单线程,切换开销小,所以效率比多线程略高;

unity 等待协程结束_unity 协程获取 imge_unity 多次执行协程

程序在进行I/O操作时unity 多次执行协程,CPU处于空闲状态,可以充分利用CPU的时间片来处理其他任务;

在单线程中,函数调用一般从函数的第一行代码开始执行,到return语句、异常或函数执行结束(也可以认为是None的隐式返回);

使用协程,如果我们在一个函数执行过程中遇到I/O密集型任务,该函数可以暂时放弃控制权,让CPU执行其他函数,等I/O操作完成后再恢复其他函数。控制。