python3 async语法小结

学习了三篇关于异步IO的文章:

  (1) http://python.jobbole.com/87310/
  (2) http://python.jobbole.com/87541/
  (3) http://python.jobbole.com/88427/
整理一下学习心得:

  1 # _*_ coding: utf-8 _*_
  2 import asyncio
  3 import functools
  4
  5
  6 async def do_some_work(x):
  7     print("\033[;31mWaiting {}s\033[0m".format(str(x)))
  8     await asyncio.sleep(x)
  9     print("\033[;32mSleep {}s Done...\033[0m".format(str(x)))
 10     return ‘Done after {}s‘.format(x)
 11
 12
 13 def callback(future):
 14     # 协程回调函数,需要 future 对象作为回调函数的最后一个参数。
 15     # 通过future.result()可以获取协程执行的结果。
 16     print("\033[;36mWaiting time {} ...\033[0m".format(future.result()))
 17
 18
 19 def done_callback(loop, future):
 20     # 协程回调函数
 21     print("\033[;36mWaiting time {} ...\033[0m".format(future.result()))
 22     loop.stop()  # Add this line for run_forever_func
 23
 24
 25 def run_until_complete_func():
 26     futu1 = asyncio.ensure_future(do_some_work(3))  # 将协程函数包装成 future 对象
 27     futu1.add_done_callback(callback)  # 为这个 future 对象添加回调函数,当协程函数运行完后会调用回调函数。
 28     # add_done_callback只能接受一个回调函数作为参数,如果回调函数有参数,可以使用偏函数预处理回调函数。
 29
 30     futu2 = asyncio.ensure_future(do_some_work(1))
 31     futu2.add_done_callback(callback)
 32
 33     futus = [futu1, futu2]
 34     loop = asyncio.get_event_loop()
 35     # run_until_complete只接受单个 coroutine 或 future 对象作为参数;
 36     # 但可以使用 asyncio.gather(*futures) 把多个future聚合包装成单个future;
 37     # 也可以使用 asyncio.wait(futures),asyncio.wait() 方法接受一个task列表。
 38     loop.run_until_complete(asyncio.gather(*futus))  # 或者:loop.run_until_complete(asyncio.wait(futus))
 39     loop.close()
 40
 41
 42 def run_forever_func():
 43     loop = asyncio.get_event_loop()
 44
 45     futu1 = asyncio.ensure_future(do_some_work(1))
 46     futu2 = asyncio.ensure_future(do_some_work(3))
 47     futus = asyncio.gather(futu1, futu2)  # 将两个 future 对象聚合成一个 future 对象
 48     futus.add_done_callback(functools.partial(done_callback, loop))  # 为聚合后的新 future 对象添加回调函数
 49
 50     loop.run_forever()
 51     loop.close()
 52
 53
 54 async def coroutine_return(start_func):
 55     coroutine1 = do_some_work(5)
 56     coroutine2 = do_some_work(10)
 57     coroutine3 = do_some_work(10)
 58     tasks = [
 59         asyncio.ensure_future(coroutine1),
 60         asyncio.ensure_future(coroutine2),
 61         asyncio.ensure_future(coroutine3)
 62     ]
 63     if start_func == ‘wait‘:
 64         return await asyncio.wait(tasks)
 65     elif start_func == ‘gather‘:
 66         return await asyncio.gather(*tasks)
 67     elif start_func == ‘as_completed‘:
 68         coroutine_results = []
 69         for task in asyncio.as_completed(tasks):
 70             result = await task  # 获取协程函数的返回值
 71             coroutine_results.append(result)
 72         return coroutine_results
 73
 74 # 【聚合后的协程函数的返回值】
 75 # (1) 如果使用asyncio.gather创建协程对象,那么使用await挂起的有阻塞的协程,它们的返回值就是协程运行的结果。
 76 # (2) 如果使用asyncio.wait创建协程对象,那么使用await挂起的有阻塞的协程,它们的返回值是一个两个元素的元组,
 77 # 元组第一个元素是finished状态的所有协程对象的集合,第二个元素目前来看是一个空的集合。
 78 # (3) 还可以使用asyncio.as_completed创建协程对象,但是这个方法和以上两个方法略有不同,
 79 # 这个方法返回一个生成器,生成器的元素是单个协程对象,然后再通过循环并使用await启动各个协程函数。
 80 # (4) run_until_complete函数可以理解为仅仅是驱动event_loop,而不会影响作为它参数的协程对象。
 81 # 即它的返回值就是作为它参数的协程函数的返回值。
 82 # (5) 当所有的协程对象都是finished状态时,才会返回。
 83
 84
 85 def coroutine_return_done(start_func):
 86     loop = asyncio.get_event_loop()
 87     if start_func == ‘wait‘:
 88         result, pending = loop.run_until_complete(coroutine_return(start_func))
 89     elif start_func == ‘gather‘:
 90         result = loop.run_until_complete(coroutine_return(start_func))
 91     elif start_func == ‘as_completed‘:
 92         result = loop.run_until_complete(coroutine_return(start_func))
 93     else:
 94         result = ‘coroutine not start...‘
 95     print(result)
 96
 97
 98 if __name__ == ‘__main__‘:
 99     run_until_complete_func()
100     # run_forever_func()
101     # coroutine_return_done(‘as_completed‘)

未完待续。。。

原文地址:https://www.cnblogs.com/Oliver-yzx/p/10310723.html

时间: 2024-11-14 12:35:38

python3 async语法小结的相关文章

Python基础--Python3基础语法

Python3 基础语法 编码 默认情况下,Python3源码文件以UTF-8编码,所有字符串都是Unicode字符串.当然也可以为源码文件指定不同的编码,例如: # -*- coding: cp-1252 -*- 标识符 1.第一个字符必须是字母表中字母或下划线: 2.标识符的其他的部分有字母.数字和下划线组成: 3.标识符对大小写敏感. 注:在Python3中,非ASCII标识符也是允许的. Python保留字 保留字即关键字,我们不能把它们用作任何标识符名称.Python的标准库提供了一个

Swift 语法小结

Swift 语法小结 1.  Optional 就是枚举 An Optional is just an enum enum Optional<T>{ case None case Some(T) } 2.Array的声明 var a=Array<String>() var a=[String]() let a=["A","B","C"]不可改 let b=a[3] 遍历Array可使用for in for array in

async语法升级踩坑小记

从今年过完年回来,三月份开始,就一直在做重构相关的事情. 就在今天刚刚上线了最新一次的重构代码,希望高峰期安好,接近半年的Node.js代码重构. 包含从callback+async.waterfall到generator+co,统统升级为了async,还顺带推动了TypeScript在我司的使用. 这些日子也踩了不少坑,也总结了一些小小的优化方案,进行精简后将一些比较关键的点,拿出来分享给大家,希望有同样在做重构的小伙伴们可以绕过这些. 为什么要升级 首先还是要谈谈改代码的理由,毕竟重构肯定是

Python3的语法糖和解析式

Python语言发展到3.X以来,有许多语法糖,例如: 三元表达式 代码块 2.封装与解构3.解析式1).列表解析式2).集合解析式3).字典解析式解析式的作用1).Python解释器为解析式专门作了优化,多写解析式会让程序更简洁高效.2).解析式就是能把程序语句写得像函数表达式一样,体现Python3面向对象的函数式编程的特点.同过嵌套的解析式,搭建程序的骨架,然后替换相应的数据结构头部(比如列表解析式的头部为列表...),就能优雅 高效地构造出一般的程序. 原文地址:http://blog.

XML语法小结

语法结构主要要求: (1)有且仅有一个根元素. 根元素也称文档元素,整个 XML 文档的其他元素都包含在根元素中,并通过嵌套形成树 型结构.除了根元素外,其他元素都是子元素. (2)每个元素必须有开始标记和结束标记,除非用特定的空元素标记"<元素/>":  开始标记的格式是:<标记名称> 结束标记的格式是:</标记名称> 开始标记和结束标记将 XML 文档中的数据进行结构化组织,确定元素内容.范围和相互 关系. (3)元素必须正确嵌套.元素嵌套时不允

python3基础语法

一.编码 默认情况下, python3源码文件以UTF-8编码,所有字符串都是unicode字符串.当然你也可以为源码文件指定不同的编码: 1 # -*- coding: gbk -*- 二.标识符 1.第一字符必须是 字母 或 下划线'_' . 2.标识符的其他的部分由字母.数字和下划线组成. 3.标识符对大小写敏感. 在python3中,非ASCII标识也是允许的. 三.python保留字 保留字即关键字,我们不能把它们作为任何标识名称.python的标准库提供了一个keyword modu

smali语法小结

smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的.基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行.Link Smali-数据类型 Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示.Dalvik字节码有两种类型:原始类型:引用类型(包括对象和数组)@link. M1.基本数据类型 V void Z boolean B by

Python3 高级语法

1.  labels = list(map(lambda t: [label_dict['<start>']] + list(t), labels)) 1 labels = list(map(lambda t: [label_dict['<start>']] + list(t), labels)) 2 3 # lambda t: [label_dict['<start>']]+list(t) 4 def func(t, label_dict): 5 return [la

python3 基本语法学习

1.在Windows下可以不写第一行注释 #!/usr/bin/python3 第一行注释标的是指向python的路径,告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器. 此外还有以下形式(推荐写法): #!/usr/bin/env python3 这种用法先在env(环境变量)设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作. 2.import与from...import 在python用import或者from...import 来导入相应的模