iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python实习总结(yeild,async,azwait和协程)
  • 169
分享到

python实习总结(yeild,async,azwait和协程)

2024-04-02 19:04:59 169人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、yield使用简析二、async和await的使用1.什么是进程、协程、异步?2.如何处理200W数量的url,把所有的url保存下来?3.使用async的await和gat

一、yield使用简析

yield是一个生成器generator,返回一个interable对象。

该对象具有next()方法,可以通过next()查看接下来的元素是什么。

1.interable对象 ,可以遍历的对象,如: list,str,tuple,dict,file,xrange等。

2.yield的作用是什么?只是循环里面的获取中间变量的一个方法,把想要的变量每次使用yield保存起来直至循环结束,循环结束得到了一个generator对象

3.为什么使用yield?使用yield,一个函数改写成generator,便具有了迭代的能力,比起用类的实例保存状态计算下一个需要迭代的值,代码更加简洁,执行流程十分简单。

4.如何判断yield的类型


def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        # print b 
        a, b = b, a + b 
        n = n + 1
for n in fab(5): 
    print n

fab不是generator,fab(5)是generator。

好比类的定义和类的实例的区别。


>>>import types 
>>> isinstance(fab, types.GeneratorType) 
False 
>>> isinstance(fab(5), types.GeneratorType) 
True

fab 是无法迭代的,而 fab(5) 是可迭代的。


>>>from collections import Iterable 
>>> isinstance(fab, Iterable) 
False 
>>> isinstance(fab(5), Iterable) 
True

5.yield在文件读取的应用?

如果字节使用read()读取一个文件,会导致不可预测的内存占用。好的方法是使用yield,固定长度的缓冲区来不断读取文件,生成读文件的迭代的generator。


def read_file(fpath): 
    BLOCK_SIZE = 1024 
    with open(fpath, 'rb') as f: 
        while True: 
            block = f.read(BLOCK_SIZE) 
            if block: 
                yield block 
            else: 
                return

二、async和await的使用

1.什么是进程、协程、异步?

  • 协程是什么?

一种用户级轻量级的线程,拥有自己的寄存器上下文和栈。

协程切换时候,将寄存器和栈保存在其他地方,当返回的时候,恢复原先保存的寄存器上下文和栈。

  • 为什么使用协程?

主流语言采用多线程并发,线程相关的概念是抢占式多任务,协程相关的协作式多任务。

不管是多进程还是多线程,每次阻塞、切换陷入系统调用。

CPU跑操作系统的调度程序,调度程序决定运行哪一个进程(线程)。

线程非常小心的处理同步问题,而协程完全不存在这个问题。

对于CPU而言,多协程是单线程,CPU不会考虑调度、切换上下文,省去CPU的切换开销。协程好于多线程的原因。

  • 如何使用协程?

多进程+协程下,避开了CPU切换的开销,又能把多个CPU充分利用起来,这种方式对于数据量较大的爬虫还有文件读写之类的效率提升是巨大的。

2.如何处理200W数量的url,把所有的url保存下来?

  • 单进程+单线程
  • 单进程+多线程:开十个线程,速度不能提高十倍。线程的切换是有开销的,无能无限的创建线程。
  • 多进程+多线程:多进程的每个进程占用一个CPU,多线程一定程度上绕过了阻塞时间,所以相比单进程的多线程效率更高。
  • 协程

3.使用async的await和gather

  • await接受一个协程列表,返回done、pending两个列表。done是已经完成的协程,pending是仍在跑的协程。通过.result()获取完成的结果
  • gather以gather(cro1, cro2, cro3, cro4…)的方式接受协程,返回的是一个结合了这么多个任务的协程。

async的使用:https://blog.csdn.net/qq_29785317/article/details/103294235


async def func1(num):
    print('--func1 start--')
    await asyncio.sleep(num)
    print('--func1 done--')
    return 'func1 ok'
async def func2(num):
    print('--func2 start--')
    await asyncio.sleep(num)
    print('--func2 done--')
    return 'func2 ok'
async def main():
    task1 = asyncio.ensure_future(func1(3))
    task2 = asyncio.ensure_future(func2(5))
    tasks = [task1, task2]
    res = await asyncio.gather(*tasks)
    return res
    # done, pending = await asyncio.wait(tasks)
    # for t in done:
    #     print(t.result())
    # print(done)
    # print(pending)
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(main())
    print(result)
```python
--func1 start--
--func2 start--
--func1 done--
--func2 done--
['func1 ok', 'func2 ok']

三、协程的理解

1.协程的过程

协程中yield是控制流程的方式。

yield同接收器一样,是一个生成器,需要先激活才能使用。


>>> def simple_corotine():
...     print('---->coroutine started')
...     x = yield  #有接收值,所以同生成器一样,需要先激活,使用next
...     print('---->coroutine recvied:',x)
...
>>> my_coro = simple_corotine()
>>> my_coro
<generator object simple_corotine at 0x0000000000A8A518>

>>> next(my_coro)  #先激活生成器,执行到yield val语句  #或者使用send(None)也可以激活生成器
---->coroutine started
>>> my_coro.send(24)  #向其中传入值,x = yield
---->coroutine recvied: 24
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration  #当生成器执行完毕时会报错

2.协程在运行中的四种状态

GEN_CREATE:等待开始执行

GEN_RUNNING:解释器正在执行,这个状态一般看不到

GEN_SUSPENDED:在yield表达式处暂停

GEN_CLOSED:执行结束


>>> def averager():
...     total = 0.0
...     count = 0
...     aver = None
...     while True:
...             term = yield aver
...             total += term
...             count += 1
...             aver = total/count
...
>>> coro_avg = averager()
>>> coro_avg.send(None)
>>> coro_avg.send(10)
10.0
>>> coro_avg.send(20)
15.0
>>> coro_avg.send(30)
20.0
>>> coro_avg.send(40)
25.0

每次循环结束在yield出暂停,直至下一个参数传进来。

3.预激活协程的装饰器(自定义激活的方式)

@装饰器的作用是什么?装饰原有的函数,给原油函数增加一个新的功能和方式。

为什么@可以实现装饰器的功能?函数也是对象,函数可以作为实参传给掐函数。


>>> def coro_active(func):
...     def inner(*args,**kwargs):
...         gen = func(*args,**kwargs)
...         next(gen)   #gen.send(None)
...         return gen
...     return inner
...
>>> @coro_active
... def averager():
...     total = 0.0
...     count = 0
...     aver = None
...     while True:
...             term = yield aver
...             total += term
...             count += 1
...             aver = total/count
...
>>> coro_avg = averager()
>>> coro_avg.send(10) 10.0 >>> coro_avg.send(20) 15.0 >>> coro_avg.send(30) 20.0

4.终止协程和异常处理

当协程的next函数或者send函数发生错误的时候,协程就会终止掉。

需要创建异常捕捉对协程的异常情况进行处理,关闭当前协程。

5.让协程返回值

yield使用方法 ↩︎

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: python实习总结(yeild,async,azwait和协程)

本文链接: https://www.lsjlt.com/news/137476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python实习总结(yeild,async,azwait和协程)
    目录一、yield使用简析二、async和await的使用1.什么是进程、协程、异步?2.如何处理200W数量的url,把所有的url保存下来?3.使用async的await和gat...
    99+
    2024-04-02
  • Shell和Python学习教程总结
    博友们好,由于运维相关技术不断发展,个人能力也不断提高,日常积累的经验不能及时更新到以往的博文中。因此,为了更好的帮助大家学习运维技术,特地针对Shell和Python脚本语言总结了文档,此文档会不定期修改或增加知识点。 下载地址:百度云盘...
    99+
    2023-01-31
    教程 Shell Python
  • Python协程的四种实现方式总结
    目录一、yield关键字实现方式二、greenlet实现方式三、asyncio实现方式四、async和await关键字实现方式一、yield关键字实现方式 以yield关键字方式实现...
    99+
    2023-01-14
    Python实现协程方式 Python协程
  • Python中Async语法协程的实现
    目录前言1.传统的Sync语法请求例子2.异步的请求3.基于生成器的协程3.1生成器3.2用生成器实现协程前言 在io比较多的场景中, Async语法编写的程序会以更少的时...
    99+
    2024-04-02
  • 总结H3CNE学习过程和其他
    虽然一个H3CNE算不上什么,但是对我这个外行来说,通过对H3CNE的学习,使我能够在网工这个方向上入门了,我也是比较欣慰的,我今年26岁,已经在干电工有5年时间了,现在在莱钢干钢铁生产线的热线抢修电工,抢修天车的。发个图给大家看吧, 这...
    99+
    2023-01-31
    过程 H3CNE
  • 怎么对Python程序学习过程进行总结
    今天就跟大家聊聊有关怎么对Python程序学习过程进行总结,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。你需要注意一些问题,比如代码编程和调试过程中的问题,这些一定要仔细和认真,Py...
    99+
    2023-06-17
  • 关于MYSQL INNODB index page header学习和实验总结
    关于INNODB  index header 所用到的工具是自己写的mysqlblock和bcview, 我放到了百度云盘 http://pan.baidu.com/s/1num76RJ 供大...
    99+
    2024-04-02
  • Python学习之流程控制与条件判断总结
    目录初识条件判断(逻辑判断)逻辑判断与逻辑语句if 语句关于逻辑判断应用的总结if … else … 语句elif 语句关于条件判断的条件嵌套条件语句的总...
    99+
    2024-04-02
  • Python 自然语言处理学习笔记:编程算法实践总结?
    Python 自然语言处理学习笔记:编程算法实践总结 自然语言处理(Natural Language Processing,简称NLP)是人工智能领域的一个重要分支,它的目标是让计算机能够像人一样理解和处理自然语言。Python 是一种广泛...
    99+
    2023-11-14
    自然语言处理 编程算法 学习笔记
  • Python学习教程:数据类型—字符串大总结
    Python学习教程:数据类型—字符串大总结 Python字符串的创建字符串是Python中最常见的数据类型,通常使用单引号或双引号来定义一个字符串,如下:str = "我是字符串"str1 = '我也是字符串&...
    99+
    2023-06-02
  • 实例详解Python的进程,线程和协程
    目录前言前提条件相关介绍实验环境进程多进程用进程池对多进程进行操作线程使用_thread模块实现使用 threading 模块实现协程使用asyncio模块实现总结前言 本文用Pyt...
    99+
    2024-04-02
  • Python的进程,线程和协程实例分析
    这篇“Python的进程,线程和协程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python的进程,线程和协程实例...
    99+
    2023-06-29
  • Python的进程,线程和协程实例详解
    目录相关介绍实验环境进程多进程用进程池对多进程进行操作线程使用_thread模块实现使用 threading 模块实现协程使用asyncio模块实现总结相关介绍 Python是一种跨...
    99+
    2024-04-02
  • 如何在Python中应用算法和对象?学习笔记总结!
    Python是一种高级编程语言,它具有简单易学、可读性高、可扩展性强等优点,广泛应用于数据科学、人工智能等领域。在Python中,算法和对象是两个非常重要的概念,本文将介绍如何在Python中应用算法和对象。 一、算法 算法是解决问题的一种...
    99+
    2023-07-08
    编程算法 对象 学习笔记
  • python 实现多线程的三种方法总结
    1._thread.start_new_thread(了解) import threading import time import _thread def job(): ...
    99+
    2024-04-02
  • Python进阶之多线程的实现方法总结
    目录线程Python中的多线程threading.Thread () 创建线程继承 threading.Thread 类的线程创建主线程使用daemon参数控制过程使用.join()...
    99+
    2023-05-16
    Python多线程实现方法 Python多线程实现 Python多线程
  • Intellij IDEA远程debug教程实战和要点总结(推荐)
    远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用。   JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设...
    99+
    2024-04-02
  • python代码实现小程序登录流程时序总结
    目录官方文档小程序登录登录流程时序说明:注意:小程序的登录总结案例官方文档 https://developers.weixin.qq.com/miniprogram/dev/fram...
    99+
    2024-04-02
  • Python 多线程知识点总结及实例用法
    Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这...
    99+
    2024-04-02
  • 分布式编程算法:Python和http协议的完美结合?
    在当今的互联网时代,分布式编程已经成为了一种非常流行的编程方式。而在分布式编程中,http协议也是一个非常重要的组成部分。Python作为一门高级语言,也在分布式编程中得到了广泛的应用。那么,Python和http协议之间是否有一种完美的...
    99+
    2023-08-22
    分布式 编程算法 http
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作