协程与线程

协程:协同程序。

协程的使用前提:直接或间接的继承MonoBehavior才可以使用。

不足:会产生外的开销。
定义:unity协程是一个能够暂停协程执行,暂停后立即返回主函数,执行主函数剩余部分,直到中断指令完成后,从中断指令的下一行开始继续执行协程剩余的函数,函数体全部执行完后,协程结束,由于中断指令的出现,使得可以将一个函数分割到多个帧里面去执行。
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是它不是多线程,Unity的协程是在每帧结束之后去检测yield的条件是否满足

协程的好处:

让原本需要采用异步+回调的形式,改成了可以类似于同步的方式

能够分步做一个比较耗时的事情,大计算量、加载的内容比较多,如果放在一个时间里来执行的话会卡顿,采用协程能够将计算分散到每一帧去

协程的坏处:

协程本质是迭代器,且是基于unity生命周期的,所以大量开启协程会引起GC,如果同时激活的协程较多,就可能出现多个高开销的协程挤在同一帧执行,导致卡顿

协程方法与普通方法的区别:
被调用时:普通方法被调用时,原来执行的部分保留现场,停止执行,然后去执行要调用的方法,并且,被调用的方法执行完之后才能返回到调用前的状态接着往下执行。。。协同方法的执行是不用等协同方法执行完再执行调用之前原来方法的代码。 而是两者异步执行。为了方便理解,这里可以把原方法(调用普通方法和协同方法的方法设为main。 普通方法叫Function,协同方法叫CoroutineFunction).
协同方法的使用规则:

1、返回值类型必须是IEumerator

2、有返回值,返回参数的时候用yield return ……

3、协程方法的调用用StartCoroutine(CoroutineMethod())

4、协成方法可暂停,用yield return newWautForSeconds(float f),参数单位是秒。

注:开启协程之后会继续运行主程序后面的代码,不会等协程方法执行结束后再回去执行主程序。两者异步执行。

协程的使用:Unity中提供了三个方法,分别负责协程的开启,协程的停止,全部协程的停止。

协程的启动:StartCoroutine();

协程的停止:StopCoroutine();

全部协程的停止:StopAllCoroutine

线程

线程是指进程内的一个执行单元,也是进程内的可调度实体。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

协程与线程的区别:

1、一个线程可以多个协程,一个进程也可以单独拥有多个协程。

2、线程进程都是同步机制,而协程则是异步。

3、协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。

4、线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。

5、协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。

6、线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。

协程线程在并发编程中扮演着不同的角色,它们之间有几个关键的区别: 1. **调度方式**:线程是由操作系统进行调度的,每个线程都有自己的调用栈程序计数器。操作系统负责决定哪个线程运行,并在适当的时候切换线程,这通常涉及到上下文切换的开销。而协程则是用户态下的轻量级线程,其调度由程序员或框架来控制,通过显式的调用转移执行权,这种方式减少了上下文切换的成本[^1]。 2. **资源消耗**:由于线程是操作系统级别的实体,创建销毁线程会占用较多的系统资源。相比之下,协程更加轻便,创建销毁的成本更低,因为它们不需要操作系统内核的支持,也不需要复杂的上下文切换过程。 3. **通信机制**:在线程间共享数据时,需要考虑同步问题,因为多个线程可能会同时访问同一块内存区域,这就需要锁等同步机制来保证数据的一致性。而对于协程来说,由于一次只有一个协程在运行(除非使用了多线程),所以可以直接安全地传递数据而无需担心同步问题,除非协程被设计为可以在不同的线程上执行。 4. **执行模型**:子程序调用(如函数)总是遵循严格的调用顺序,即一个入口点,一次返回。但协程允许在执行过程中暂停并在之后从暂停的地方恢复执行,这种特性使得编写异步代码变得更加直观易于管理。线程则提供了更传统的并发模型,其中每个线程独立地执行任务[^2]。 5. **抽象层次**:虽然协程可以看作是对线程的一种抽象,但它并不是用来替代线程的。实际上,协程往往依赖于线程来实际执行任务。线程作为底层资源提供者,为协程提供了运行的基础。协程通过执行器(Interceptor)线程交互,可以灵活地将协程分配给当前线程、UI线程或是新创建的线程池中的线程[^1]。 综上所述,线程更适合处理需要大量并行计算的任务,而协程则适用于需要大量并发但每个任务相对简单且可能涉及等待的情况,例如网络请求、文件I/O等场景。 ```python # 示例:Python中使用asyncio库定义一个简单的协程 import asyncio async def simple_coroutine(): print("协程开始") await asyncio.sleep(1) # 模拟IO操作 print("协程结束") # 创建任务并运行 loop = asyncio.get_event_loop() loop.run_until_complete(simple_coroutine()) ``` 这段代码展示了如何定义一个简单的协程函数,它会在开始后休眠一秒,然后继续执行。使用`asyncio`库可以让开发者更容易地编写异步非阻塞代码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gxy_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值