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. [翻译] KGModal

    KGModal KGModal is an easy drop in control that allows you to display any view in a modal popup. The ...

  2. django定义Model中的方法和属性

    #定义一个Model class UserProfile(models.Model): user=models.OneToOneField(User,unique=True) phone=models ...

  3. Linux入门-5 用户及权限基础

    1. Linux用户基础 用户 相关文件 查看登录的用户 添加用户 修改用户信息 删除用户 组 2. Linux权限机制 权限 UGO 修改文件所属用户和组 修改权限 3. Linux权限扩展 默认权 ...

  4. 删除 maven仓库,更新失败的jar包命令

    set REPOSITORY_PATH=D:\maven_cpbsrem ص‎شعثرث÷...for /f "delims=" %%i in ('dir /b /s " ...

  5. 041队列queue(重要,多线程使用)

    内容:队列类型.方法.使用 ###############queue定义了3种信息列队模式类Queue([maxsize]):FIFO列队模式LifoQueue([maxsize]):LIFO列队模式 ...

  6. LVS.md

    LVS 概述 简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,官方站点.现在LVS已经是 Linux标准内核的一部分, ...

  7. Input and Output-The input is all the sources of action for your app

    Programs take input and produce output. The output is the result of doing something with the input. ...

  8. 新闻cms管理系统(二) ---- 后台登录功能

    1.页面准备: (1)前端资源的导入:将准备好的页面添加到项目中,放到Public目录下(公共的页面样式.js.图片等资源) (2)添加登录的视图模板 将登录页面的视图放到Amin>View&g ...

  9. Dubbo实践(十一)远程调用流程

    默认协议的rpc 过程是比较复杂的,其中涉及到了各个方面,其余各协议实际上有对这个过程进行简化:因此看懂了默认协议的rpc 过程,其他协议就非常容易懂了.在讲Dubbo通信过程之前,可以先了解:Jav ...

  10. ORACLE NLS_LENGTH_SEMANTICS 参数的用途

    NLS_LENGTH_SEMANTICS参数是一个专为创建CHAR和VARCHAR2两种字符型的列时,指定使用的字节长度,还是使用字符长度的定义方式,有byte和char两种值,默认为byte. 当设 ...