zoukankan      html  css  js  c++  java
  • 11.13 同步异步协程

    1.异步同步 和 阻塞非阻塞

      同步:提交任务必须等待任务完成,才能执行下一行

      异步: 提交任务不需要等待任务完成,立刻执行下一行

      线程的三种状态:就绪  运行  阻塞

      阻塞:遇到了io操作 代码卡死 无法执行下一行 cpu会切换到其他任务

      非阻塞: 代码正在执行(运行状态) 或处于就绪状态

    2.异步回调

            为什么需要回调?

                子进程帮助主进程完成任务  处理任务的结果应该交还给主进程

            其他方式也可以将数据交还给主进程 比如:

                1.shutdown  主进程会等到所有任务完成

                2.result函数 会阻塞直到任务完成

                都有阻塞  这样会导致效率降低 所以使用回调

            注意点:

                回调函数什么时候被执行? 子进程任务完成时

                谁在执行回调函数? 主进程

            线程的异步回调

                使用方式都相同  唯一的不同是执行回调函数 是子线程在执行

             requests 用于网络(HTTP)发请求

             response 响应请求

             content  响应的内容

    3.线程队列

            队列:先进先出

                                q=queue.Queue()

            堆栈:先进后出 后进先出 

            q=queue.LifoQueue()

           

      优先级队列:优先出

            q=queue.PriorityQueue()

    4.协程 

            协程的目的是在单线程下实现并发

            为什么出现协程? 因为cpython 由于GIL原因导致同一时间只有一个线程再跑

                意味着 如果你的程序是计算密集 多线程效率也不会提升

                            如果是io密集型  就没有必要在单线程下实现并发

    可以开启多线程来处理io  但是子线遇到io时, cpu会切走  我们不能保证一定回切到主线    

    如果可以在遇到io的时候转而去做计算 这样一来可以保证cpu一直在处理你的程序  当然时间太长也要切走(这是正常的操作)

    小结:单线下实现并发 将io阻塞时间用于执行计算 可以提高效率

    原理:一直使用CPU直到超时

           

    怎么实现单线程并发?

            并发 指的是 看起来像是同时运行 实际是在任务间来回切换 同时需要保存执行的状态

                任务就是一堆代码  也可以用函数装起来

                1.如何让两个函数切换执行

                    yield可以保存函数的执行状态

                    通过生成器可以实现伪并发

                    当任务全是计算时 并发不一定提升效率 反而会降低效率

                2.如何知道发生了io? 从而切换执行

                                                   安装第三方模块 File---àsettings--àproject interpreter -à点击+添加

                         第三方模块 greenlet 可以实现并发 但是不能检测io

                                                            1.实例化greenlet得到一个对象 传入要执行的任务至少需要两个任务

                      2.先让某个任务执行起来 使用对象调用switch

                    3.在任务的执行过程中 手动调用switch来切换

                                                  

          第三方模块 gevent 封装greenlet 可以实现单线程并发 并且能够检测io操作 自动切换

                                                            1.spawn函数传入你的任务

                     2.调用join 去开启任务

                        3.检测io操作需要打monkey补丁  就是一个函数 在程序最开始的地方调用它

      协程的应用场景:

                TCP 多客户端实现方式

                1.来一个客户端就来一个进程     资源消耗较大

                2.来一个客户端就来一个线程     也不能无限开

                3.用进程池 或 线程池  还是一个线程或进程只能维护一个连接

                4.协程 一个线程就可以处理多个客户端  遇到io就切到另一个

  • 相关阅读:
    dart 库
    dart effective-设计
    Python3-Set
    python 基本输入和输出+变量和基本对象
    python 基本语法元素
    模版方法模式 展现程序员的一天
    外观模式 一键电影模式
    装饰者模式 带你重回传奇世界
    命令模式 之 管理智能家电
    适配器模式 以手机充电器为例
  • 原文地址:https://www.cnblogs.com/zhouhai007/p/9954800.html
Copyright © 2011-2022 走看看