zoukankan      html  css  js  c++  java
  • 协程

    协程是什么

    协程当然不是卖票的软件,他可以说是程序员意淫出来的。

    操作系统并不承认协程的存在

    可以说协程是开发人员自己设计的能够骗过操作系统的一种方式。

    操作系统—》多个进程

    进程—》多个线程

    线程—》多个协程

    操作系统可以开多个进程,进程可以开多个线程,线程又可以开多个协程。

    一切都是为了并发,而开多个协程是为了能够提高效率,为什么,看下面。

    现在有一条线程,他有3个方法需要执行,第一个方法要睡三秒,第二个方法要睡四秒,第三个方法是最重要的代码在里面。

    正常情况下,通过操作系统对cup的调度,要想执行完这个线程的所有任务,至少要7秒多对吧?

    cup切到这个线程上,发现在io,切走了,确实io不用占用cpu也可以继续执行,但是要想在执行第二个方法,必须等上三秒,这个等待的时间,cup切到过这个线程很多很多很多次,但都发现这个线程在io,等到他结束了io,cup切了回来,看到第二个任务又是睡四秒,又是io,于是同样的事情发生了,继续等四秒。也就是说想要执行完这个线程的全部内容至少要7秒多。

    现在我们聪明的程序员使用了协程,就是在这个线程里面,遇到io,自己切,并且不然操作系统发现,在这几个任务里面来回狂切,然后这些io就开始一起io了,然后最多是不是就io4秒?省下了很多时间。

    要注意的是,在这io的四秒钟,cpu也会切到别的线程去,因为就算操作系统没发现你在io,你也占用了很久的cpu了,这就是两种会让cpu切换的情况之一,使用时间过长,如果不用协程,就会是io让cpu切走了。

    现在被切走了又有什么关系呢?我们两个方法的io已经开始了。而且自己控制切换要比操作系统切换快的多.降低了单个线程的io时间。

    最重要的一点是什么?

    协程只适合io密集型任务

    你们应该都发现了,他的作用就是让io一起来,不是串行。所以他在搞计算密集型的时候,就没有意义了,反而会更加耗时,因为他会不停的来回切来回切。

    总结一下

    python的线程用的是操作系统原生的线程

    协程:单线程下实现并发
    并发:切换+保存状态
    多线程:操作系统帮你实现的,如果遇到io切换,执行时间过长也会切换,实现一个雨露均沾的效果.

    什么样的协程是有意义的?
        遇到io切换的时候才有意义
        具体:
        协程概念本质是程序员抽象出来的,操作系统根本不知道协程存在,也就说来了一个线程我自己遇到io 我自己线程内部直接切到自己的别的任务上了,操作系统跟本发现不了,
    也就是实现了单线程下效率最高.
    
    优点:
        自己控制切换要比操作系统切换快的多
    缺点:
        对比多线程
        自己要检测所有的io,但凡有一个阻塞整体都跟着阻塞.
        对比多进程
        无法利用多核优势.
    

    为什么要有协程(遇到io切换)?
    自己控制切换要比操作系统切换快的多.降低了单个线程的io时间,

  • 相关阅读:
    cocos2dx的内存管理机制
    cocos2d-x多分辨率适配方案:setDesignResolutionSize使用
    在lua脚本中使用我们自定义的精灵类
    cocos2d-x内存管理(见解)
    MongoDB学习笔记(2):数据库操作及CURD初步
    剑指Offer:树的子结构
    剑指Offer:反转链表
    剑指Offer:调整数组顺序使奇数位于偶数前面【21】
    剑指Offer:链表中倒数第k个结点【22】
    剑指Offer:合并两个排序的链表【25】
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11557743.html
Copyright © 2011-2022 走看看