这是python3.6以上版本的用法,本例是python3.7.2编写
使用asyncio模块的异步编程模型,生产这消费者,异步生产,用sleep来代替IO等待
使用async和await语法来进行描述
async关键字描述一个方法是异步函数(协程),是可以被send()的,也是可以被asyncio加入到协程池进行调度的
yield关键字表示在async描述的方法中定义一个出入点,相当于return,但是可以在下一次函数被send()或者循环调用时作为切入点继续向下运行。
await关键字表示挂起等待的IO,函数内部后续运算会等待此处IO结束再运行,其他协程函数会在此等待时使用CPU进行运行。
#生产这消费者模型,
#消费者到超市购买土豆和西红柿
#需要买50个土豆和50个西红柿
#当前货架上,有5个土豆,5个西红柿
#消费者开始拿取
#具体逻辑
# 一个一个拿东西
#从货架拿土豆,一个一个的,当货架上的土豆拿完了,去问土豆还有没,触发土豆工厂开始做土豆,随机几个,生产需要花费时间,
# 所以,业务上认定为是1秒生产一个,全部生产完成才上架,这里简化为获取时间与生产个数相同,一秒生产一个,这里不是重点,重点是体现了上架需要时间。
#在等待生产上架土豆的过程中,开始拿取西红柿,
#西红柿也是同样道理,等待西红柿时去拿取土豆,如此往复,如果都在未上架,则等待 程序代码如下:
import asyncio,random

class Potato:
'''定义一个土豆生产厂家'''
@classmethod
def make(cls, num, *args, **kws):
potatos = []
print("开始制造 %s 个土豆" % num)
for i in range(num):
print("制造第[%s]土豆"%i)
potatos.append(cls.__new__(cls, *args, **kws))
return potatos # 先生成5个土豆并且上架
all_potatos = Potato.make(5) class Tomatos:
'''定义一个西红柿生产厂家'''
@classmethod
def make(cls, num, *args, **kws):
totatos = []
print("开始制造 %s 个西红柿" % num)
for i in range(num):
print("制造第[%s]西红柿" % i)
totatos.append(cls.__new__(cls, *args, **kws)) return totatos all_tomatos = Tomatos.make(5) async def ask_for_potato():
'''询问土豆,制造的土豆,上架土豆,忽略写法,直接描述了上架全程所需时间'''
make_num=random.randint(1, 10)
print("开始进行挂起,生产%s个土豆"%make_num)
print("接下来遇到IO等待,运行其他协程函数")
await asyncio.sleep(make_num)
all_potatos.extend(Potato.make(make_num))
print("已经完成%s个土豆的生产"%make_num) async def take_potatos(num):
'''从货架拿取土豆'''
count = 0
while True:
if len(all_potatos) == 0:
print("开始进行挂起,上架土豆")
await ask_for_potato()
potato = all_potatos.pop()
yield potato
count += 1
if count == num:
break async def buy_potatos():
'''购买土豆,放在自己的篮子里,一共拿去50个,描述了一个需求,并开始动作'''
bucket = []
async for p in take_potatos(50):
bucket.append(p)
print(f'取到土豆: {id(p)}...') async def ask_for_tomatos():
'''询问西红柿,制造的西红柿,上架西红柿,忽略写法,直接描述了上架全程所需时间'''
make_num=random.randint(1, 10)
print("开始进行挂起,生产%s个西红柿" % make_num)
print("接下来遇到IO等待,运行其他协程函数")
await asyncio.sleep(make_num)
all_tomatos.extend(Tomatos.make(make_num))
print("已经完成%s个西红柿的生产"%make_num) async def take_tomatos(num):
'''从货架拿取西红柿'''
count = 0
while True:
if len(all_tomatos) == 0:
print("开始进行挂起,上架西红柿")
await ask_for_tomatos()
potato = all_tomatos.pop()
yield potato
count += 1
if count == num:
break
async def buy_tomatos():
'''购买西红柿,放在自己的篮子里,一共拿去50个,描述了一个需求,并开始动作'''
bucket = []
async for p in take_tomatos(50):
bucket.append(p)
print(f'取到西红柿: {id(p)}...') def main():
import asyncio
loop = asyncio.get_event_loop()
res = loop.run_until_complete(asyncio.wait([buy_potatos(), buy_tomatos()]))
loop.close() if __name__=="__main__":
import time
begin_time=time.time()
main()
end_time=time.time()
print("耗时是:%s秒"%(end_time-begin_time))

运行结果:

开始制造 5 个土豆
制造第[0]土豆
制造第[1]土豆
制造第[2]土豆
制造第[3]土豆
制造第[4]土豆
开始制造 5 个西红柿
制造第[0]西红柿
制造第[1]西红柿
制造第[2]西红柿
制造第[3]西红柿
制造第[4]西红柿
取到西红柿: 140473681858176...
取到西红柿: 140473681857504...
取到西红柿: 140473681857448...
取到西红柿: 140473681857560...
取到西红柿: 140473681857168...
开始进行挂起,上架西红柿
开始进行挂起,生产7个西红柿
接下来遇到IO等待,运行其他协程函数
取到土豆: 140473681857112...
取到土豆: 140473681855768...
取到土豆: 140473681855712...
取到土豆: 140473743063304...
取到土豆: 140473743062688...
开始进行挂起,上架土豆
开始进行挂起,生产7个土豆
接下来遇到IO等待,运行其他协程函数
开始制造 7 个西红柿
制造第[0]西红柿
制造第[1]西红柿
制造第[2]西红柿
制造第[3]西红柿
制造第[4]西红柿
制造第[5]西红柿
制造第[6]西红柿
已经完成7个西红柿的生产
取到西红柿: 140473681877928...
取到西红柿: 140473681877872...
取到西红柿: 140473681877816...
取到西红柿: 140473681877760...
取到西红柿: 140473681877592...
取到西红柿: 140473681877648...
取到西红柿: 140473681877704...
开始进行挂起,上架西红柿
开始进行挂起,生产10个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 7 个土豆
制造第[0]土豆
制造第[1]土豆
制造第[2]土豆
制造第[3]土豆
制造第[4]土豆
制造第[5]土豆
制造第[6]土豆
已经完成7个土豆的生产
取到土豆: 140473681878320...
取到土豆: 140473681878264...
取到土豆: 140473681878208...
取到土豆: 140473681878152...
取到土豆: 140473681878096...
取到土豆: 140473681878040...
取到土豆: 140473681877984...
开始进行挂起,上架土豆
开始进行挂起,生产9个土豆
接下来遇到IO等待,运行其他协程函数
开始制造 9 个土豆
制造第[0]土豆
制造第[1]土豆
制造第[2]土豆
制造第[3]土豆
制造第[4]土豆
制造第[5]土豆
制造第[6]土豆
制造第[7]土豆
制造第[8]土豆
已经完成9个土豆的生产
取到土豆: 140473681878824...
取到土豆: 140473681878768...
取到土豆: 140473681878712...
取到土豆: 140473681878656...
取到土豆: 140473681878600...
取到土豆: 140473681878544...
取到土豆: 140473681878488...
取到土豆: 140473681878432...
取到土豆: 140473681878376...
开始进行挂起,上架土豆
开始进行挂起,生产9个土豆
接下来遇到IO等待,运行其他协程函数
开始制造 10 个西红柿
制造第[0]西红柿
制造第[1]西红柿
制造第[2]西红柿
制造第[3]西红柿
制造第[4]西红柿
制造第[5]西红柿
制造第[6]西红柿
制造第[7]西红柿
制造第[8]西红柿
制造第[9]西红柿
已经完成10个西红柿的生产
取到西红柿: 140473670754712...
取到西红柿: 140473670754656...
取到西红柿: 140473670754600...
取到西红柿: 140473670754544...
取到西红柿: 140473670754488...
取到西红柿: 140473670754432...
取到西红柿: 140473670754376...
取到西红柿: 140473681878992...
取到西红柿: 140473681878936...
取到西红柿: 140473681878880...
开始进行挂起,上架西红柿
开始进行挂起,生产7个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 7 个西红柿
制造第[0]西红柿
制造第[1]西红柿
制造第[2]西红柿
制造第[3]西红柿
制造第[4]西红柿
制造第[5]西红柿
制造第[6]西红柿
已经完成7个西红柿的生产
取到西红柿: 140473670755104...
取到西红柿: 140473670755048...
取到西红柿: 140473670754992...
取到西红柿: 140473670754936...
取到西红柿: 140473670754880...
取到西红柿: 140473670754824...
取到西红柿: 140473670754768...
开始进行挂起,上架西红柿
开始进行挂起,生产7个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 9 个土豆
制造第[0]土豆
制造第[1]土豆
制造第[2]土豆
制造第[3]土豆
制造第[4]土豆
制造第[5]土豆
制造第[6]土豆
制造第[7]土豆
制造第[8]土豆
已经完成9个土豆的生产
取到土豆: 140473670755608...
取到土豆: 140473670755552...
取到土豆: 140473670755496...
取到土豆: 140473670755440...
取到土豆: 140473670755384...
取到土豆: 140473670755328...
取到土豆: 140473670755272...
取到土豆: 140473670755216...
取到土豆: 140473670755160...
开始进行挂起,上架土豆
开始进行挂起,生产8个土豆
接下来遇到IO等待,运行其他协程函数
开始制造 7 个西红柿
制造第[0]西红柿
制造第[1]西红柿
制造第[2]西红柿
制造第[3]西红柿
制造第[4]西红柿
制造第[5]西红柿
制造第[6]西红柿
已经完成7个西红柿的生产
取到西红柿: 140473670756000...
取到西红柿: 140473670755944...
取到西红柿: 140473670755888...
取到西红柿: 140473670755832...
取到西红柿: 140473670755776...
取到西红柿: 140473670755720...
取到西红柿: 140473670755664...
开始进行挂起,上架西红柿
开始进行挂起,生产1个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 1 个西红柿
制造第[0]西红柿
已经完成1个西红柿的生产
取到西红柿: 140473670756056...
开始进行挂起,上架西红柿
开始进行挂起,生产4个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 8 个土豆
制造第[0]土豆
制造第[1]土豆
制造第[2]土豆
制造第[3]土豆
制造第[4]土豆
制造第[5]土豆
制造第[6]土豆
制造第[7]土豆
已经完成8个土豆的生产
取到土豆: 140473670756504...
取到土豆: 140473670756448...
取到土豆: 140473670756392...
取到土豆: 140473670756336...
取到土豆: 140473670756280...
取到土豆: 140473670756224...
取到土豆: 140473670756168...
取到土豆: 140473670756112...
开始进行挂起,上架土豆
开始进行挂起,生产5个土豆
接下来遇到IO等待,运行其他协程函数
开始制造 4 个西红柿
制造第[0]西红柿
制造第[1]西红柿
制造第[2]西红柿
制造第[3]西红柿
已经完成4个西红柿的生产
取到西红柿: 140473670756728...
取到西红柿: 140473670756672...
取到西红柿: 140473670756616...
取到西红柿: 140473670756560...
开始进行挂起,上架西红柿
开始进行挂起,生产1个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 1 个西红柿
制造第[0]西红柿
已经完成1个西红柿的生产
取到西红柿: 140473670756784...
开始进行挂起,上架西红柿
开始进行挂起,生产2个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 5 个土豆
制造第[0]土豆
制造第[1]土豆
制造第[2]土豆
制造第[3]土豆
制造第[4]土豆
已经完成5个土豆的生产
取到土豆: 140473670757064...
取到土豆: 140473670757008...
取到土豆: 140473670756952...
取到土豆: 140473670756896...
取到土豆: 140473670756840...
开始进行挂起,上架土豆
开始进行挂起,生产10个土豆
接下来遇到IO等待,运行其他协程函数
开始制造 2 个西红柿
制造第[0]西红柿
制造第[1]西红柿
已经完成2个西红柿的生产
取到西红柿: 140473670757176...
取到西红柿: 140473670757120...
开始进行挂起,上架西红柿
开始进行挂起,生产9个西红柿
接下来遇到IO等待,运行其他协程函数
开始制造 10 个土豆
制造第[0]土豆
制造第[1]土豆
制造第[2]土豆
制造第[3]土豆
制造第[4]土豆
制造第[5]土豆
制造第[6]土豆
制造第[7]土豆
制造第[8]土豆
制造第[9]土豆
已经完成10个土豆的生产
取到土豆: 140473670757736...
取到土豆: 140473670757680...
取到土豆: 140473670757624...
取到土豆: 140473670757568...
取到土豆: 140473670757512...
取到土豆: 140473670757456...
取到土豆: 140473670757400...
开始制造 9 个西红柿
制造第[0]西红柿
制造第[1]西红柿
制造第[2]西红柿
制造第[3]西红柿
制造第[4]西红柿
制造第[5]西红柿
制造第[6]西红柿
制造第[7]西红柿
制造第[8]西红柿
已经完成9个西红柿的生产
取到西红柿: 140473681878152...
取到西红柿: 140473681878208...
取到西红柿: 140473681878264...
取到西红柿: 140473681878320...
取到西红柿: 140473743062688...
取到西红柿: 140473743063304...
耗时是:48.02546787261963秒

参考资料:

https://www.cnblogs.com/dhcn/p/9032461.html

python3.6以上 asyncio模块的异步编程模型 async await语法的更多相关文章

  1. 多线程之异步编程: 经典和最新的异步编程模型,async与await

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  2. C# 异步编程(async&await)

    同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...

  3. 异步编程(async&await)

    前言 本来这篇文章上个月就该发布了,但是因为忙 QuarkDoc 一直没有时间整理,所以耽搁到今天,现在回归正轨. C# 5.0 虽然只引入了2个新关键词:async和await.然而它大大简化了异步 ...

  4. 学习迭代器实现C#异步编程——仿async/await(一)

    .NET 4.5的async/await真是个神奇的东西,巧妙异常以致我不禁对其实现充满好奇,但一直难以窥探其门径.不意间读了此篇强文<Asynchronous Programming in C ...

  5. 基于任务的异步编程(Task,async,await)

    这节讲一下比较高级的异步编程用法Task,以及两个异步关键字async和await. Task是在C#5.0推出的语法,它是基于任务的异步编程语法,是对Thread的升级,也提供了很多API,先看一下 ...

  6. c# 异步编程demo (async await)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  7. ASP.NET 异步编程之Async await

    本文重点介绍的是.NET Framework4.5 推出的异步编程方案  async await 请先看个5分钟的微软演示的视频:视频地址: https://channel9.msdn.com/Blo ...

  8. JS魔法堂:深究JS异步编程模型

    前言  上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...

  9. 深究JS异步编程模型

    前言  上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...

随机推荐

  1. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡【SAM】

    有一个显然的性质就是每个串一定在某个叶子为根的树中是一条直的链 然后因为SAM里是不会有相同状态的,所以以每个叶子为根dfs一遍,并且动态构造SAM(这里的节点u的last指向父亲),最后统计答案就是 ...

  2. poj 2412 The Balance 【exgcd】By cellur925

    题目传送门 一遇到数学就卡住,我这是怎么肥4...(或许到图论会愉悦吧,逃) Description * 给出两种重量为的 A, B 的砝码,给出一种使用最少的砝码的方式,称出重量 C. 我们可以比较 ...

  3. Java 反射机制详解(下)

    续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...

  4. django相关命令

    1 安装django pip3 install django 2 django-admin命令 django-admin startproject mysite #创建一个项目 3 manage.py ...

  5. 2-zakoo使用

    source:http://kazoo.readthedocs.io/en/latest/basic_usage.html 1 基本使用 1.1 连接处理 要使用zakoo,需要创建一个KazooCl ...

  6. 浅谈web前端性能优化

    前端性能优化: 一.尽可能减少前端http请求. 1.合并优化脚本文件和css文件. 2.同种类型的背景图片尽量放在一起,用css控制显示. 二.使用浏览器缓存. 如果能强制浏览器缓存在本地,将会降低 ...

  7. HDFS Java API

    HDFS Java API 搭建Hadoop客户端与Java访问HDFS集群

  8. Codeforces 1144G(dp)

    据说这题是种dp的套路?然后被我国红名神仙(南大Roundgod)贪心了,不过思路上非常相近了,故而可贪吧. 设的dp[i][0]是:如果把第i个数放在上升序列里了,那么下降序列结尾的那个最大是多少: ...

  9. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  10. ACM_扫雷(dfs)

    扫雷 Time Limit: 2000/1000ms (Java/Others) Problem Description: 扫雷这个游戏想必各位都是会玩的吧.简单说一下规则,n行m列的格子地图上有分布 ...