协程 - Coroutines

Awaitable Objects,
Awaitable Objects 通常由 __await__() 生成, 而
Coroutine objects 是由 async def 关键字定义的函数 return 的 Awaitable Objects.
Note,
被 types.coroutine() or asyncio.coroutine() 装饰的生成器迭代器对象(generator iterator objects)
是没有通过 __await__() 生成的 Awaitable Objects. object.__await__(self) 必须 return 一个 iterator, 用来生成 Awaitable Objects.
如, asyncio.Future 执行这个方法一兼容 await 表达式.
See also PEP 492 for additional information about awaitable objects. Coroutine Objects,
Coroutine objects 是 awaitable objects, 是一个 __await__() return 的 iterator,
Coroutine 的执行就是对 __await__() return 的 iterator 的迭代. 跟 iterator 一样,
当 coroutine 执行完毕后 raises StopIteration, 这个异常的 value 属性是执行返回的结果.
如果 coroutine raises an exception, 这个异常会被'冒泡式' 返回. Coroutines 不可以直接
raise 一个未加工过的 StopIteration exceptions. Coroutines 有如下方法(与 generator 相似), 但是与 generators 不同的是 coroutines 不对
迭代提供直接的支持. Python version 3.5.2, 之后 在一个 coroutine 上多次 await 返回
RuntimeError exception. coroutine.send(value)
开始或者恢复 coroutine 的执行. 如果参数 value = None, 为对 coroutine 的预激活.
若 value 不是 None, 这个方法相当于 iterator 的 send() 方法, 将使 coroutine 暂停.
方法的返回 (return value, StopIteration, or other exception) 上面已经描述过. coroutine.throw(type[, value[, traceback]])
在 coroutine raise specified exception.
这个方法对应 iterator 中的 throw() 方法, 会使 coroutine 暂停 coroutine.close()
使 coroutine 去初始化并退出. 对应 iterator 的 close() 方法. Asynchronous Iterators
一个 asynchronous iterable 通过调用 __aiter__() 得到一个 asynchronous iterator.
Asynchronous iterators 可以被用在一个 async 声明中. object.__aiter__(self)
返回一个 asynchronous iterator 对象. object.__anext__(self)
从 iterator 中返回一个 awaitable 对象. 当 iterator 结束的时候
raise StopAsyncIteration error exception asynchronous iterable object 的例子, class Reader:
async def readline(self):
... def __aiter__(self):
return self async def __anext__(self):
val = await self.readline()
if val == b'':
raise StopAsyncIteration
return val Asynchronous Context Managers,
asynchronous context manager 是一个能够暂停执行的 context manager .
Asynchronous context managers 可以通过 async with 关键字声明.
object.__aenter__(self)
与 __enter__() 类似, 不同之处在于 方法必须返回一个 awaitable 对象. object.__aexit__(self, exc_type, exc_value, traceback),
与 __exit__() 类似, 不同之处在于 方法必须返回一个 awaitable 对象. asynchronous context manager 的例子,
class AsyncContextManager:
async def __aenter__(self):
await log('entering context') async def __aexit__(self, exc_type, exc, tb):
await log('exiting context') Reference,
Python doc. https://docs.python.org/3/reference/datamodel.html#coroutines

Python 协程 - Coroutines的更多相关文章

  1. Python 协程总结

    Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...

  2. [转载] Python协程从零开始到放弃

    Python协程从零开始到放弃 Web安全 作者:美丽联合安全MLSRC   2017-10-09  3,973   Author: lightless@Meili-inc Date: 2017100 ...

  3. python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  4. day-5 python协程与I/O编程深入浅出

    基于python编程语言环境,重新学习了一遍操作系统IO编程基本知识,同时也学习了什么是协程,通过实际编程,了解进程+协程的优势. 一.python协程编程实现 1.  什么是协程(以下内容来自维基百 ...

  5. 终结python协程----从yield到actor模型的实现

    把应用程序的代码分为多个代码块,正常情况代码自上而下顺序执行.如果代码块A运行过程中,能够切换执行代码块B,又能够从代码块B再切换回去继续执行代码块A,这就实现了协程 我们知道线程的调度(线程上下文切 ...

  6. 从yield 到yield from再到python协程

    yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...

  7. 关于python协程中aiorwlock 使用问题

    最近工作中多个项目都开始用asyncio aiohttp aiomysql aioredis ,其实也是更好的用python的协程,但是使用的过程中也是遇到了很多问题,最近遇到的就是 关于aiorwl ...

  8. 用yield实现python协程

    刚刚介绍了pythonyield关键字,趁热打铁,现在来了解一下yield实现协程. 引用官方的说法: 与线程相比,协程更轻量.一个python线程大概占用8M内存,而一个协程只占用1KB不到内存.协 ...

  9. 00.用 yield 实现 Python 协程

    来源:Python与数据分析 链接: https://mp.weixin.qq.com/s/GrU6C-x4K0WBNPYNJBCrMw 什么是协程 引用官方的说法: 协程是一种用户态的轻量级线程,协 ...

随机推荐

  1. 如何在ArcGIS中恢复MapGIS制图表达信息

    1.输出符号信息 Map2Shp软件中提供了图示表达转换功能,提供对MapGIS图形特征可视表达信息的跨平台支持.若要使用该功能,必须在转换时,"图元参数输出方式"选定为[图元参数 ...

  2. 从零开发一款txt小说下载器

    在日常开发中,列表是一个非常常用的一个东西,可以用listview和recyclerview实现.当然,由于recyclerview更为实用且强大,它也是更好的方案. 而我以前为了方便,习惯直接拿网上 ...

  3. js正则定义支付宝账号、手机号、邮箱

    一.支付宝账号:可以只输入数字.字母.字母(数字)+数字(字母),其中只字母中可以含有@._或者.也可以三者都可以包含并且可以在任意位置,限制:小于等于30位(可根据需求自定义范围): let  zh ...

  4. Linux删除文件 清除缓存

    相信很多测试 经常会经历开发叫你清除缓存这种事. 那我们要怎么清呢? 一.首先,确认你要清除的缓存在哪个目录下,然后切换到该目录下,比如 我现在知道我的的缓存目录是在newerp这个目录下,则如图 二 ...

  5. 【Linux】---Linux系统下各种常用命令总结

    在Linux系统下,“万物皆文件”,之所以强调在强调这个概念,是因为很多人已经习惯了win系统下找找点点得那种方式和思维,因此总是会觉得linux系统下很多指令既复杂又难记.其实都是一样得东西,只是w ...

  6. [状压DP思路妙题]图

    源自 luhong 大爷的 FJ 省冬令营模拟赛题 Statement 给定一个 \(n\) 个点 \(m\) 条边的图,没有重边与自环 每条边的两端点编号之差不超过 \(12\) 求选出一个非空点集 ...

  7. OpenCV里的颜色空间

    RGB三原色组合方式是最常用的 RGB色彩空间: R:红色分量 G:绿色分量 B:蓝色分量 HSV色彩空间: H - 色调(主波长). S - 饱和度(纯度/色调). V - 明度(强度). LAB色 ...

  8. Day3-Python3基础-函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数的定义 定义: 函数是指将一组语句的集 ...

  9. 自学前端开发,现在手握大厂offer,我的故事还在继续

    简要背景 我是一个非科班出身的程序员,而且是连续跨专业者,用一句话总结就是:16 届本科学完物流,保送研究生转交通,自学前端开发的休学创业者. 17 年休学创业,正式开始学习前端,离开创业公司后,我又 ...

  10. 剑指offer--二维数组中查找

    剑指offer--二维数组中查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组 ...