美文网首页
unity 进程和协程原理与线程的区别(转)

unity 进程和协程原理与线程的区别(转)

作者: 雄关漫道从头越 | 来源:发表于2019-10-10 10:29 被阅读0次

说到协程,我们首先回顾以下线程与进程这两个概念。在操作系统(os)级别,有进程(process)和线程(thread)两个我们看不到但又实际存在的“东西”,这两个东西都是用来模拟“并行”的,写操作系统的程序员通过用一定的策略给不同的进程和线程分配CPU计算资源,来让用户“以为”几个不同的事情在“同时”进行“。在单CPU上,是os代码强制把一个进程或者线程挂起,换成另外一个来计算,所以,实际上是串行的,只是“概念上的并行”。在现在的多核的cpu上,线程可能是“真正并行的”。

线程、进程、协程的区别

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。

协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。

打个比方吧,假设有一个操作系统,是单核的,系统上没有其他的程序需要运行,有两个线程 A 和 B ,A 和 B 在单独运行时都需要 10 秒来完成自己的任务,而且任务都是运算操作,A B 之间也没有竞争和共享数据的问题。现在 A B 两个线程并行,操作系统会不停的在 A B 两个线程之间切换,达到一种伪并行的效果,假设切换的频率是每秒一次,切换的成本是 0.1 秒(主要是栈切换),总共需要 20 + 19 * 0.1 = 21.9 秒。如果使用协程的方式,可以先运行协程 A ,A 结束的时候让位给协程 B ,只发生一次切换,总时间是 20 + 1 * 0.1 = 20.1 秒。如果系统是双核的,而且线程是标准线程,那么 A B 两个线程就可以真并行,总时间只需要 10 秒,而协程的方案仍然需要 20.1 秒。


Unity协程执行原理

unity中协程执行过程中,通过yield return XXX,将程序挂起,去执行接下来的内容,注意协程不是线程,在为遇到yield return XXX语句之前,协程额方法和一般的方法是相同的,也就是程序在执行到yield return XXX语句之后,接着才会执行的是 StartCoroutine()方法之后的程序,走的还是单线程模式,仅仅是将yield return XXX语句之后的内容暂时挂起,等到特定的时间才执行。
那么挂起的程序什么时候才执行,这就要看monoBehavior的生命周期了。

也就是协同程序主要是update()方法之后,lateUpdate()方法之前调用的,接下来我们通过一个小例子去理解一下。

using UnityEngine;
using System.Collections;
using System.Threading;
public class test : MonoBehaviour
{     
    void Start()    
    { 
         StartCoroutine(tt());//开启协程
         for (int i = 0; i < 200; i++)   //循环A
         {
              Debug.Log("*************************" + i);
              Thread.Sleep(10);
          }
    }
    IEnumerator tt()   
    {
          for (int i = 0; i < 100; i++) //循环B
          {
              Debug.Log("-------------------" + i);
          }
          yield return new WaitForSeconds(1); //协程1
          for (int i = 0; i < 100; i++) //循环C
          {
              Debug.Log(">>>>>>>>>>>>>>>>>>>>" + i);
              yield return null; //协程1
        }
    } 
    // 更新数据
    void Update()
    {
        Debug.Log("Update");
    }
     //晚于更新
    void LateUpdate()
    {
       Debug.Log("------LateUpdate");
    }
}

程序的运行结果为:


先执行循环B,然后执行循环A,然后执行update()和lateUpdate()的方法,等待1S之后,在updat()和lateupda()之间执行循环C的输出。

相关文章

  • unity 进程和协程原理与线程的区别(转)

    说到协程,我们首先回顾以下线程与进程这两个概念。在操作系统(os)级别,有进程(process)和线程(threa...

  • Python多线程、多进程和协程的实例讲解

    线程、进程和协程是什么 线程、进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实...

  • 说一说协程

    首先,我们了解一下进程,线程和协程三个概念之间的区别 进程,线程,协程区别 进程 拥有自己独立的堆和栈,既不共享堆...

  • 不同语言的协程示例

    进程和线程、协程的区别async 函数的含义和用法上面两篇文章介绍进程,线程, 和协程,以及javascript中...

  • Go语言学习笔记七(并发编程)

    协程机制 Golang 线程和协程的区别 备注:需要区分进程、线程(内核级线程)、协程(用户级线程)三个概念。 进...

  • 进程、线程和协程的理解

    进程、线程和协程的理解 进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。 进程拥有自己独...

  • 进程,线程和协程的区别

    一、进程 操作系统中最核心的概念是进程,分布式系统中最重要的问题是进程间通信。 进程是“程序执行的一个实例” ,担...

  • Python 线程和进程和协程总结

    Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU...

  • Go 协程调度的个人理解

    1.1 协程与进程的区别 首先,我理解的操作系统调度等级为 进程 —— 线程 —— 协程。其中进程和线程的区别是本...

  • 并发请求

    进程-线程-协程 简单描述 进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。进程拥有自己...

网友评论

      本文标题:unity 进程和协程原理与线程的区别(转)

      本文链接:https://www.haomeiwen.com/subject/dxjopctx.html