await这个关键词以及asyncio.wait asyncio.gather
1.asyncio.wait asyncio.gather这两个都是接受多个future或coro组成的列表,但是不同的是,asyncio.gather会将列表中不是task的coro预先封装为future,而wait则不会。
不过,loop.run_until_complete(asyncio.wait(tasks))运行时,会首先将tasks列表里的coro先转换为future
2.await关键词。异步io的关键在于,await io操作,此时,当前携程就会被挂起,时间循环转而执行其他携程,但是要注意前面这句话,并不是说所有携程里的await都会导致当前携程的挂起,要看await后面跟的是什么,如果跟的是我们定义的携程,则会执行这个携程,如果是asyncio模块制作者定义的固有携程,比如模拟io操作的asyncio.sleep,以及io操作,比如网络io:asyncio.open_connection这些,才会挂起当前携程。
3.关于asyncio.as_completed.的运行原理:
import asyncio
import time async def a():
print ("")
return 8 b=asyncio.ensure_future(a())
loop = asyncio.get_event_loop()
loop.run_until_complete(b)
#运行到这里产生了一个已经执行完毕的task-b
async def do_some_work(x):
time.sleep(2)
print("waiting:",x)
await asyncio.sleep(x)
return "Done after {}s".format(x) async def main():
coroutine1 = do_some_work(1)
coroutine2 = do_some_work(2)
coroutine3 = do_some_work(4)
coroutine4 = do_some_work(4)
coroutine5 = do_some_work(4)
coroutine6 = do_some_work(4)
coroutine7 = do_some_work(4)
coroutine8 = do_some_work(4)
coroutine9 = do_some_work(4)
tasks = [
coroutine1,
coroutine2,
b,
coroutine3,
coroutine4,
coroutine5,
coroutine6,
coroutine7,
coroutine8,
coroutine9,
]#故意在这个tasks列表中加入已经完成的task-b
for task in asyncio.as_completed(tasks):#这条语句会首先将tasks列表中的coro转为task
print ("gaga")
result = await task#挂起当前携程,转而执行别的携程,直到所有的携程全部挂起的时候,本携程才能再次拿到执行权,因为最早完成的是b,所以result是8
print("Task ret: {}".format(result)) loop.run_until_complete(main())#这条语句首先将main()转为task,目前只有这一个pending状态的task,和之前finished状态的b,所以先执行这个。
#我这里两次运行了run_until_complete
4.ensure_future的作用,比如ensure_future(b())是将b()携程(coro)加入到task中,当我们启动eventloop的时候,就会按照task产生的先后顺序依次去执行。
#!/usr/bin/env py3 import asyncio
async def a():
print ("a")
async def b():
print ("b") asyncio.ensure_future(a())
bb=asyncio.ensure_future(b())
loop = asyncio.get_event_loop()
loop.run_until_complete(bb)#虽然传入的参数是task-bb,但是task-a却会执行,
#并且是第一个执行,首先打印a,其次打印b
await这个关键词以及asyncio.wait asyncio.gather的更多相关文章
- python asyncio wait和gather
1. wait, 等待某某执行完成以后才执行下一步 FIRST_COMPLETED = concurrent.futures.FIRST_COMPLETED FIRST_EXCEPTION = con ...
- asyncio之asyncio.run
asyncio.run(coro, *, debug=False) python3.7加入,只能作为asyncio的入口函数.
- python3.6以上 asyncio模块的异步编程模型 async await语法
这是python3.6以上版本的用法,本例是python3.7.2编写使用asyncio模块的异步编程模型,生产这消费者,异步生产,用sleep来代替IO等待使用async和await语法来进行描述a ...
- python中重要的模块--asyncio
一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asynci ...
- 如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)
Django视图函数执行,不在主线程中,直接 loop = asyncio.new_event_loop() # 更不能loop = asyncio.get_event_loop() 会触发 Runt ...
- Python并发编程之学习异步IO框架:asyncio 中篇(十)
大家好,并发编程 进入第十章.好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了.为了更好地衔接这一节,我们先来回顾一下上 ...
- asyncio异步IO--协程(Coroutine)与任务(Task)详解
摘要:本文翻译自Coroutines and Tasks,主要介绍asyncio中用于处理协程和任务的方法和接口.在翻译过程中,译者在官方文档的基础上增加了部分样例代码和示意图表,以帮助读者对文档的理 ...
- asyncio之Coroutines,Tasks and Future
asyncio之Coroutines,Tasks and Future Coroutines and Tasks属于High-level APIs,也就是高级层的api. 本节概述用于协程和任务的高级 ...
- asyncio并发编程
一. 事件循环 1.注: 实现搭配:事件循环+回调(驱动生成器[协程])+epoll(IO多路复用),asyncio是Python用于解决异步编程的一整套解决方案: 基于asynico:tornado ...
随机推荐
- 递归思维判断数组a[N]是否为一个递增数组
递归的方法:记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { ) { return true; } ) { ] ...
- 增删改查的SSM小项目
经过将近一个月的摸索,终于算是勉强完成了关于增删改查的SSM项目. github源码地址:https://github.com/123456abcdefg/Login 好了,话不多说,写一下具体代 ...
- 信用评分卡Credit Scorecards (1-7)
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 python风控评分卡建模和风控常识 https://study.163.com/course/introductio ...
- hive metastore && hiveserver2 . jvm 配置调整优化
hive-env.sh 添加如下,其中踩坑踩了不少. if [ "$SERVICE" = "metastore" ]; then if [ -z "$ ...
- java io系列09之 FileDescriptor总结
本章对FileDescriptor进行介绍 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_09.html FileDescriptor 介绍 Fil ...
- Mac下显示网页全屏快捷键
control+command+F mac下谷歌浏览器全屏时隐藏头部:(隐藏标签页和地址栏) command+shift+B
- ruby新建web项目步骤,使用mysql数据库
1.创建一个项目 指定数据库 rails new demo02 -d mysql 2.修改 config/database.yml 修改数据库密码 default: &default adap ...
- 【leetcode-69】 x 的平方根
(主要是越界问题) 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 ...
- java项目中文件含义
1. java项目 .project:是工程构建配置文件 .classpath:保存的是项目所用的外部引用包的路径 .settings:记录项目配置变化的记录文件夹 src:sourcefolder项 ...
- HTTP Method小记
HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这3个方法 HTTP 1.1 这个版本是当前版本,包含GET HEAD POST OPTIONS PUT ...