zoukankan      html  css  js  c++  java
  • 异步回调,协程

    同步异步:
    同步:发起一个任务以后,代码等待任务执行结束拿到结果才继续往下面执行代码
    异步:发起一个任务后,不需要等待,代码继续往下执行
    指的是任务的发起方式

    异步任务的效率高于同步
    应用场景:当你的任务是不需要立即获得结果的,并且还有其他的任务需要处理,就发起异步任务

    如何发起异步任务:多线程 多进程

    阻塞非阻塞:
    阻塞:程序遇到了IO操作,导致代码无法继续执行,CPU执行权切到别的程序
    非阻塞:程序执行没有遇到IO操作 或者 即使遇到了IO操作 也不阻塞代码执行
    指的是应用程序所处的状态
    写程序时,要尽量减少IO操作

    同步与阻塞的区别:
    阻塞一定意味着:CPU执行权切走了
    而同步有可能是因为计算任务比较耗时

    异步回调:
    (add_done_callback)
    获取异步任务结果的方式
    回调:说的是回调函数,给异步任务绑定一个函数,当任务完成时会自动调用该函数

    具体使用:
    当你往poll中添加一个异步任务,会返回一个表示结果的对象
    有一个对象绑定方法:add_done_callback 需要一个函数作为参数
    注意:回调函数,必须且只能有一个参数 就是对象本身
    通过对象的.result来获得结果
    回调函数交给子线程来执行,谁有空谁处理

    线程队列:
    在queue模块下导入三个容器类,Queue,LifoQueue,PriorityQueue
    Queue是正常的队列,先进先出,能够等待

    LifoQueue是后进先出队列(堆栈)

    PriorityQueue是优先级队列

    事件:
    事件是一个通知信息,表示什么时间发生什么事情

    用于线程间通讯
    线程间 本来就是数据共享的 也就是说,即使没有事件也没有问题
    线程之间,执行流程是完全独立的,一些时候可能需要知道另一个
    线程发生了什么然后才去一些行动
    这个时候就可以使用事件来简化代码
    使用方法
    从 threading模块中导入Event 然后使用Event实例化一个对象
    在一个线程执行到某一个特定代码时,使用实例化对象的set方法
    然后再另一个线程使用wait方法直到等到一个线程的set方法生效
    就完成了事件

    协程:
    协程就是要用单线程来实现并发
    什么是协程:
    协程指的是一个单线程并发执行多个任务
    用于提高效率 在检测到IO操作时,切换到其他的非IO操作 这样一来
    在操作系统眼里程序依然没有阻塞,力求尽可能的多占用CPU的执行权

    为什么需要协程:
    GIL导致多个线程不能并行,效率低
    CPython中多个线程不能并行

    所以为了能够提高效率,提高CPU的使用率,就需要协程

    如何使用协程:
    创建两个函数,一个函数使用yield函数暂停函数运行同时保存状态
    另一个函数正常运行,每次循环调用生成器的next方法就是协程

    greenlet模块:
    greenlet函数是对yield函数做了封装
    简化了书写,但是,它不能检测IO操作

    Gevent模块:
    gevent 可以实现单线程并发,还可以检测到IO操作
    导入gevent函数,导入gevent.monkey函数
    然后使用monkey函数的patch.all()方法给模块打上补丁
    这样大部分的阻塞模块都会变成非阻塞模块
  • 相关阅读:
    浅谈三层架构
    尺度空间(Scale space)理论
    漫游Kafka实现篇之消息和日志
    杭电 2095
    .net调用Outlook 批量发送邮件,可指定Outlook中的账号来发送邮件
    Java实现 蓝桥杯VIP 算法提高 计算时间
    Java实现 蓝桥杯VIP 算法提高 计算时间
    Java实现 蓝桥杯VIP 算法提高 计算时间
    Java实现 蓝桥杯VIP 算法提高 计算时间
    Java实现 蓝桥杯VIP 算法提高 最小乘积(提高型)
  • 原文地址:https://www.cnblogs.com/xiezuodd/p/10513078.html
Copyright © 2011-2022 走看看