zoukankan      html  css  js  c++  java
  • 8-3-1python语法基础-并发编程-协程&asyncio&异步

    ####

    https://www.cnblogs.com/wupeiqi/p/12834355.html

    https://pythonav.com/wiki/detail/6/91/

    ####

    协程:

    ###

    #####

    协程首先要明确,线程和进程都是系统帮咱们开辟的,不管是thread还是process他内部都是调用的系统的API,
    而对于协程来说它和系统毫无关系;协程不同于线程的是,线程是抢占式的调度,而协程是协同式的调度,也就是说,协程需要自己做调度。
    他就和程序员有关系,对于线程和进程来说,调度是由CPU来决定调度的;对于协程来说,程序员就是上帝,你想让谁执行到哪里他就执行到哪里;

    协程存在的意义:
    对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。
    协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
    适用场景:其实在其他语言中,协程的其实是意义不大的多线程即可已解决I/O的问题,但是在python因为他有GIL(Global Interpreter Lock 全局解释器锁 )在同一时间只有一个线程在工作,
    所以:如果一个线程里面I/O操作特别多,协程就比较适用;

    协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。
    协程的特点在于是一个线程执行,那和多线程比,协程有何优势? 最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。 因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

     #####

    结果就是1,3,2,4

    ####

    结果就是1,3,4,2

    但是在企业里不会使用这种方式,但是你要了解这种yield也可以实现协程的定义,就是两个代码块之间切换,

    ####

    结果:1,3,2,4,

    coroutine这个是协程的意思,也就是说用这个装饰器装饰过的函数,就是一个协程函数了

    但是要记住这种函数就不能func() 这样来执行调用了,要用事件循环来实现

    这个比上面的两个更牛逼,这是遇到io之后自动切换,而不是上面的手动切换,

    假设是下载图片,假设下载图片都是2秒,也就是2秒就把两个图片都下载下来了,如果按照之前的for循环,是需要4秒的,

    ####

    本质和上面一样的,就是把装饰器换成了async,把yield from换成了await,

    ###

    总结:

    在asyncio出现之前都是用的gevent,现在用第四种最多,中间两个都是为了理解

    ###

    协程的意义

    协程就是能在代码块之间切换,

    协程的意义是什么?利用在一个线程中,如果遇到io等待的时间,不会傻傻的等着,会利用空闲的时间干点其他的事情,

    案例:使用普通的方式下载

    使用异步的方式的下载图片:

    需要下载第三方模块:pip install aiohttp

    同步:就是一个结束之后才会进行下一个,这个是同步编程,这个就好像是排队,

    异步,就是一个没有结束,但是会执行下一个,这个就是异步方式的编程,

    3,异步编程

    ####

     python3.7之后只需要一句就可以了,但是之前是两句,其实是等价的,就是创建了事件循环,并且把函数加入到了事件循环中,

    ###

     ###

    ###

     ####

     

     ###

    这种实际代码不会这么写,只是为了理解,task,看示例2

    main是一个主线程,然后里面有两个任务,

    ###

     这种用的是最多的,

    ###

    这种用的不多,但是你要了解,

    ####

    future就是理解,平时不会手动创建这个future的,

    ###

     asyncio.future和concurrent.futures这两个是不一样的,

    因为有些模块是不支持协程的异步的操作的,这个时候就需要使用进程池,或者线程池的方式来进行异步操作,

    以后会用到的,因为有些模块比较老,不支持协程的异步,

    下面是示例:

     ###

     ####

    这个异步迭代器的知识点,只是了解,不做掌握,用的很少,

    ####

     这个还是挺有用的,涉及到这种需要打开,操作,关闭的,都是可以应用的,

    ####

    到这里就完了,异步编程就这些内容,

    注意,不支持Windows

    加那两句,就是把事件循环替换成uvloop的事件循环,性能比默认的要好两倍,性能接近go,

    ###

    实战案例:

     ####

    如果是连接MongoDB呢,如果没有这个提供的现成的模块,就不能异步了吗?也是可以的,可以使用线程池或者进程池的方式,但是这种比较耗费资源, 

    ####

    luffy就是文件的名字

    ####

     ####

    这个异步早就有了,不是新技术,只是Python中没有这么盛行,但是更多的框架往这个方向靠拢,比如公司要使用fastAPI,tornado,Django3,你就不了解,

    这样程序员的压力就大了,你就要去学习这个,掌握这个,

    ####

    #####

  • 相关阅读:
    MySQL数据库8(十九)外键
    MySQL数据库8(十八)用户权限管理
    HTML基本样式
    HTML5之部分新特性
    MySQL数据库8(十七)数据库的备份还原
    MySQL数据库8(十六)子查询
    MySQL数据库(十五)联合查询与连接查询
    MySQL数据库8(十四)聚合函数和运算符
    MySQL数据库8(十三)高级数据操作之select指令
    MySQL数据库8(十二)高级数据操作
  • 原文地址:https://www.cnblogs.com/andy0816/p/15040847.html
Copyright © 2011-2022 走看看