asyncio(上)

asyncio 的几个概念

  • event_loop(事件循环):程序开启一个无线的循环,程序员会把一些函数(协程)注册到事件循环上,当满足事件发生的时候,调用相应的协程函数。

  • coroutine(协程):协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行,而是生成一个协程对象。协程对象需要注册到事件循环,由事件循环调用。

  • future(对象):代表将来执行或没有执行的任务的结果,与task没有本质上的区别。

  • task(任务):一个协程对象就是一个原生可以挂起的函数,任务则是对协程的进一步封装,其中包含任务的各种状态,Task对象是Future的子类,它将coroutine和Future联系在一起,将协程对象封装成一个future对象。

  • async / await(关键字):python 3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口,其作用在一定程度上类似于yield from

将生成器标记为协程

只要在一个生成器函数头部使用装饰器 @asyncio.coroutine,就标记为协程对象。实际上,本质还是一个生成器

import asyncio

def hello():
yield 1 @asyncio.coroutine
def hello1():
yield from asyncio.sleep(1) if __name__ == '__main__':
res = hello()
res1 = hello1()
print(type(res))
print(type(res1))

协程的执行流程

协程的完整执行流程

  • 创建一个协程对象
  • 创建一个事件循环容器
  • 将协程对象转为task任务
  • 将任务注册到事件循环中执行
import asyncio

async def hello():
print('协程的完整执行流程')
print('1:创建一个协程对象')
print('2:创建一个事件循环容器')
print('3:将协程对象转为task任务')
print('4:将任务注册到事件循环中执行') # 创建一个协程对象
cor = hello() # 创建一个事件循环容器
loop = asyncio.get_event_loop() # 将协程对象转为task任务
# task = loop.create_task(cor)
task = asyncio.ensure_future(cor) # 将任务注册到事件循环中执行
loop.run_until_complete(task)

await 与 yield from 对比

前面概念已经说过,await作用与yield from类似,都是实现暂停的效果,但是功能上却不兼容,就是不能在生成器中使用await,也不能在async定义的协程中使用yield from



除此之外呢,还有一点很重要的。

  • yield from 后面跟可迭代对象,也可以跟 future objcoroutine obj
  • await 后面必须接 future objcoroutine obj

验证之前先介绍一个函数

asyncio.sleep(sec):这个是asyncio模块自带的函数,可以模拟io阻塞。返回的是一个协程对象。

import asyncio

# await 跟协程
async def f1():
await asyncio.sleep(1)
print('await 跟协程') # yield from 跟协程
def f2():
yield from asyncio.sleep(2)
print('yield from 跟协程') # await 跟 future
async def f3():
await asyncio.ensure_future(asyncio.sleep(3))
print('await 接 future') # yield from 跟 future
def f4():
yield from asyncio.ensure_future(asyncio.sleep(4))
print('yield from 跟 future')

绑定回调函数

异步IO的实现原理,就是在IO的地方挂起,执行其他任务,等IO结束,再继续执行。回调的方式实现方法有两种。

第一种:

async def slp(t):
await asyncio.sleep(t)
return '暂停了 %d s' % t cor = slp(5)
loop = asyncio.get_event_loop()
task = loop.create_task(cor)
loop.run_until_complete(task) print('返回结果:',task.result())

第二种:

async def slp(t):
await asyncio.sleep(t)
return '暂停了 %d s' % t def callback(future):
print('这是回调函数,返回结果是:', future.result()) cor = slp(5)
loop = asyncio.get_event_loop()
task = loop.create_task(cor) # 为task添加回调函数
task.add_done_callback(callback) loop.run_until_complete(task)

003.2---asyncio模块(上)的更多相关文章

  1. Python之asyncio模块的使用

    asyncio模块作用:构建协程并发应用的工具 python并发的三大内置模块,简单认识: .multiprocessing:多进程并发处理 .threading模块:多线程并发处理 .asyncio ...

  2. python协程--asyncio模块(基础并发测试)

    在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段时间片内实际上的执行是单线程的.同时还存 ...

  3. 读asyncio模块源码时的知识补漏

    硬着头皮看了一周的asyncio模块代码,了解了大概的执行流程,引用太多,成尤其是对象间函数的引用. 光是这么一段简单的代码: # coding: utf8 import asyncio import ...

  4. asyncio模块

    asyncio模块   这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念. asyncio 是干什么的? 异步网络操作 并发 协程 python3 ...

  5. python3.6以上 asyncio模块的异步编程模型 async await语法

    这是python3.6以上版本的用法,本例是python3.7.2编写使用asyncio模块的异步编程模型,生产这消费者,异步生产,用sleep来代替IO等待使用async和await语法来进行描述a ...

  6. Python之路(第四十七篇) 协程:greenlet模块\gevent模块\asyncio模块

    一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程,最大的区别在于 ...

  7. Python asyncio 模块

    Python 3.4 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLo ...

  8. asyncio模块实现单线程-多任务的异步协程

    本篇介绍基于asyncio模块,实现单线程-多任务的异步协程 基本概念 协程函数 协程函数: 定义形式为 async def 的函数; aysnc 在Python3.5+版本新增了aysnc和awai ...

  9. Python:asyncio模块学习

    python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...

随机推荐

  1. Andriod(3)——Understanding Android Resources

    Now, we will follow that introduction with an in-depth look at Android SDK fundamentals and cover re ...

  2. mysql服务器硬件配置选择参考

    这是在网上找的一个关于如何评估一个mysql服务器的硬件需求的文章,转载以备用 5 Minute DBA – Database Server Hardware Selection Posted on  ...

  3. C# 数据类型转换 显式转型、隐式转型、强制转型

    C# 的类型转换有 显式转型 和 隐式转型 两种方式. 显式转型:有可能引发异常.精确度丢失及其他问题的转换方式.需要使用手段进行转换操作. 隐式转型:不会改变原有数据精确度.引发异常,不会发生任何问 ...

  4. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  5. August 21st 2017 Week 34th Monday

    In fact, the happiest fairy tale is no more than the simple days we have together. 其实全世界最幸福的童话,也比不上我 ...

  6. Foj 2299 Prefix(AC自动机、DP)

    Foj 2299 Prefix 题意 给定串s.正整数n,问有多少长度为n的字符串t满足:s[0...i]是t的子串,s[0...i+1]不是. 题解 求有多少长度为n的字符串t满足:s[0...i] ...

  7. 团队作业—预则立&&他山之石(人月神教)

    1.团队任务 GitHub issues 1.2 团队计划 2.访谈任务 2.1采访对象 采访团队:龙威零式 采访时间:2017.10.23 采访形式:微信群 2.2采访内容 问:你们选题的时候有哪些 ...

  8. Android Volley源码分析及扩展

    转载请标明出处: http://www.cnblogs.com/why168888/p/6681232.html 本文出自:[Edwin博客园] Volley 介绍 Android系统中主要提供了两种 ...

  9. webstorm中导入git项目

    1.打开webStrom 配置git File–setting

  10. iOS的图片:解码(CPU)与内存(缓存)

    图片的数据:资源数据(地址).原始数据(Data).显示数据(解码后的数据) 解压图片 - PNG或者JPEG压缩之后的图片文件会比同质量的位图小得多.但是在图片绘制到屏幕上之前,必须把它扩展成完整的 ...