返回顶部
首页 > 资讯 > 后端开发 > Python >python3.6以上 asyncio模
  • 642
分享到

python3.6以上 asyncio模

asyncio 2023-01-30 23:01:33 642人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这是python3.6以上版本的用法,本例是python3.7.2编写使用asyncio模块的异步编程模型,生产这消费者,异步生产,用sleep来代替IO等待使用async和await语法来进行描述async关键字描述一个方法是异步函数(

这是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

--结束END--

本文标题: python3.6以上 asyncio模

本文链接: https://lsjlt.com/news/181103.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python3.6以上 asyncio模
    这是python3.6以上版本的用法,本例是python3.7.2编写使用asyncio模块的异步编程模型,生产这消费者,异步生产,用sleep来代替IO等待使用async和await语法来进行描述async关键字描述一个方法是异步函数(...
    99+
    2023-01-30
    asyncio
  • Pycharm+,,Python3.6以
      首先说明一下,Django2.0以上版本不支持Mysql5.7以下版本,Python3.4以上版本不支持mysqldb,如何在这种环境下通过Django操作mysql数据库那? 1.安装Mysql5.7以上版本请看我的上一篇博客,里面...
    99+
    2023-01-30
    Pycharm
  • python协程--asyncio模块(
    在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段时间片内实际上的执行是单线程的。同时还存在着资源争夺的问题。python3.4...
    99+
    2023-01-30
    模块 python 协程
  • Python标准模块--asyncio
    asyncio模块作为一个临时的库,在Python 3.4版本中加入。这意味着,asyncio模块可能做不到向后兼容甚至在后续的Python版本中被删除。根据Python官方文档,asyncio通过coroutines、sockets和其它...
    99+
    2023-01-31
    模块 标准 Python
  • 在python3.6上访问impala数
    在python3.6上访问impala数据库 安装impyla包 cmd: python3 -m pip install impyla 在安装的过程中可能会报出Microsoft Visual C++ 14.0 is re...
    99+
    2023-01-31
    impala
  • OpenCV3.3+Python3.6实现图片高斯模糊
    本文实例为大家分享了OpenCV3.3+Python3.6实现图片高斯模糊的具体代码,供大家参考,具体内容如下 高斯模糊 高斯模糊(英语:Gaussian Blur),通常用它来减少图像噪声以及降低细节层次。这种模糊...
    99+
    2022-06-02
    OpenCV python 高斯模糊
  • centos7如何升级python3.6、安装ipython6.4以及pip
    这篇文章主要介绍centos7如何升级python3.6、安装ipython6.4以及pip,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!系统环境为centos7,需要使用python3以及交互窗口ipython一、...
    99+
    2023-06-02
  • Python3.6 Schedule模块定时任务(实例讲解)
    一,编程环境 PyCharm2016,Anaconda3 Python3.6 需要安装schedule模块,该模块网址:https://pypi.python.org/pypi/schedule 打开Ana...
    99+
    2022-06-04
    实例 模块 Schedule
  • 简单有效上手Python3异步asyncio问题
    目录Python3异步asyncio问题更新下面是学习过程中记录的偏低层实现的资料最基本的定义和应用什么时候使用异步并发和并行异步结果回调总结Python3异步asyncio问题 官...
    99+
    2023-01-03
    Python3异步asyncio Python3 asyncio Python3异步
  • Ubuntu上安装和使用Python3.6的方法是什么
    这篇文章主要介绍了Ubuntu上安装和使用Python3.6的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Ubuntu上安装和使用Python3.6的方法是什么文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-04
  • Python协程asyncio模块的演变及高级用法
    目录Python协程及asyncio基础知识定义协程函数及执行方法的演变创建协程任务的演变获取协程任务执行结果通过asyncio.gather获取协程任务执行结果asyncio高级使用方法给任务添加回调函数设置任务超...
    99+
    2022-06-02
    Python 协程 python asyncio模块
  • Python3.6统计模块statsmodels的安装教程及使用方法
    Python3.6统计模块statsmodels的安装教程及使用方法 如果你需要对数据进行深入的统计分析和建模,那么Python编程语言中的statsmodels模块会是你的不二之选。该模块提供了多种...
    99+
    2023-09-23
    python 机器学习 开发语言 Python
  • python3.10及以上版本编译安装ssl模块
    前言 由于python3.10之后版本不在支持libressl使用ssl,需要使用openssl安装来解决编译安装python时候遇到的ssl模块导入失败的问题,这里需要用的openssl1.1....
    99+
    2023-09-03
    ssl perl python
  • 怎么在Python中利用 Asyncio模块实现一个生产消费者模型
    本文章向大家介绍怎么在Python中利用 Asyncio模块实现一个生产消费者模型的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Python主要用来做什么Python主要应用于:1、Web开发;2、数...
    99+
    2023-06-06
  • 在Windows电脑上以安全模式打开Office应用
    在Windows电脑上以安全模式打开Office应用,可以按照以下步骤操作:1. 关闭所有Office应用程序。2. 按下Windo...
    99+
    2023-09-14
    Windows
  • MongoDB升级到3.0以上的Zabbix监控模板变更
    一 应用场景描述 线上一些MongoDB数据库实例升级到了3.0,查看Zabbix server的日志不断有监控主机的MongoDB监控报错 6697:20160519:222116.5...
    99+
    2022-11-30
    mongodb 以上 上的
  • Java以命令模式设计模式
    目录Java以命令模式设计模式1、简单介绍2、命令模式Java以命令模式设计模式 1、简单介绍 意图: 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解...
    99+
    2024-04-02
  • 雷电模拟器安卓7以上+Charles抓包APP最新教程
    文章目录 【前言简介】一、工具准备:二、Charles设置(一)电脑上证书安装(二)安卓模拟器上系统证书安装(RooT权限打开)(三)Charles的代理端口设置和允许SLL设置 三、雷电模拟器网络配置四、开启全局代理五、检测...
    99+
    2023-08-19
    android ssl https
  • 云服务器可以挂模拟器吗安全吗苹果手机上
    对于模拟器来说,安全性是一个非常重要的考虑因素。由于模拟器的使用方式和云服务器不同,因此可能存在一些安全漏洞和风险。例如,模拟器可能会利用应用程序的漏洞或攻击者可能已经利用的漏洞来执行攻击。这些攻击可能会导致用户的应用程序被攻击者利用,从而...
    99+
    2023-10-28
    模拟器 机上 苹果
  • django模板系统(上)
    filters 过滤 default 替代作用 filesizeformat 格式化为人类可读 add 给变量加参数 lower 小写 upper 大写 title 标题 ljust 左对...
    99+
    2023-01-30
    模板 系统 django
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作