什么是协程

作者: Java老A | 来源:发表于2019-08-03 21:02 被阅读2次

    协程(Coroutine)又称为微线程,我们知道线程是CPU的执行的最小单位,线程执行的最小代码单位是方法。

    比如在执行的时候,一个线程从程序的入口调用Main方法,Main调用A方法,A方法又调用B方法,整个函数的执行完成的顺序是B->A->Main。这个调用的顺序是明确的,是通过压栈和出栈的方式确定的。

    而协程不同, Main调用B,在调用B的过程中可以中断,Main函数继续执行一会,Main再中断,B继续再执行一会, 继续执行的代码是上次中断的地方。

    用伪代码表示两个方法:

    funcA(){
         funcB();
         print 4;
         print 5;
         print 6;
    }
    funcB(){
         print 1;
         print 2;
         print 3;
    }
    

    如果是用正常的单线程线程来执行的时候,打印结果是123456,如果采用协程,打印结果就有可能是142536.

    协程的执行的结果有点和多线程类似,但本质与多线程不同,线程有上下文切换,存在变量的拷贝,而协程只是轻量级的方法中断,所以切换效率是高于线程。

    协程所有的变量都是共享内存,访问不需要加锁,使用时只需简单的判断,不存在线程不安全问题。

    在Java中,还不支持协程的机制,所以用C#来演示下协程的过程。

       static void Main(string[] args)
       {
            System.Console.WriteLine("执行方法:Main");
            IEnumerable<int> intList = Xc.GetList();
            foreach (int i in intList)
            {
                 System.Console.WriteLine("协程1:执行");
                 Console.WriteLine("协程1:获得返回的结果是:" + i);
            }
       }
    
       class Xc
       {
            public static IEnumerable<int> GetList()
            {
                 System.Console.WriteLine("执行方法:GetList");
                 for (int i = 0; i < 10; i++)
                 {
                      yield return i;
                      System.Console.WriteLine("协程2: 执行");
                      System.Console.WriteLine("协程2:doSomething");
                      Thread.Sleep(1000);
                 }
            }
       }
    
    
    

    执行结果如下:

       执行方法:Main
       执行方法:GetList
       协程1:执行
       协程1:获得返回的结果是:0
       协程2: 执行
       协程2:doSomething
       协程1:执行
       协程1:获得返回的结果是:1
       协程2: 执行
       协程2:doSomething
       协程1:执行
       协程1:获得返回的结果是:2
    
    

    从上面的结果可以看出,在协程1循环执行的时,Main方法会中断,执行GetList方法,执行GetList到达约定中断点,Main方法又继续执行。


    gzh.jpg

    获得最新的博主文章,请关注上方公众号

    相关文章

      网友评论

        本文标题:什么是协程

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