首页 > 编程语言 >Python异步编程技术详解:async、await、yield和anext

Python异步编程技术详解:async、await、yield和anext

时间:2024-07-05 17:56:55浏览次数:13  
标签:异步 await Python anext print async def asyncio

Python异步编程技术详解:async、await、yield和anext

异步编程是Python中一种强大的并发编程模式,可以显著提高I/O密集型应用的性能。本文将详细介绍Python中的几种重要的异步编程技术,包括async/await、yield和anext等,并通过一个实际的代码示例来展示它们的使用。

1. async和await

asyncawait是Python 3.5引入的语法,用于定义和使用协程(coroutine)。

  • async def用于定义一个协程函数
  • await用于等待一个协程完成

示例:

import asyncio

async def fetch_data():
    print("开始获取数据...")
    await asyncio.sleep(2)  # 模拟I/O操作
    print("数据获取完成!")
    return {"data": "some_value"}

async def main():
    result = await fetch_data()
    print(f"获取到的数据: {result}")

asyncio.run(main())

2. yield

yield关键字用于定义生成器函数。在异步编程中,它常用于创建异步生成器。

示例:

async def async_generator():
    for i in range(3):
        await asyncio.sleep(1)
        yield i

async def main():
    async for number in async_generator():
        print(f"生成的数字: {number}")

asyncio.run(main())

3. anext

anext()是Python 3.10引入的函数,用于获取异步迭代器的下一个值。它返回一个协程对象,可以使用await等待结果。

示例:

import asyncio

async def async_counter(stop):
    count = 0
    while count < stop:
        yield count
        count += 1
        await asyncio.sleep(0.1)

async def main():
    counter = async_counter(3)
    try:
        while True:
            value = await anext(counter)
            print(f"计数: {value}")
    except StopAsyncIteration:
        print("计数结束")

asyncio.run(main())

4. StopAsyncIteration

StopAsyncIteration是一个异常,用于标识异步迭代的结束。当异步迭代器没有更多的值可以产生时,会抛出这个异常。

5. 综合示例:异步聊天机器人

下面是一个结合了上述所有概念的异步聊天机器人示例:

import asyncio
import random

class ChatBot:
    def __init__(self, name):
        self.name = name

    async def generate_response(self, message):
        await asyncio.sleep(random.uniform(0.5, 2.0))  # 模拟思考时间
        responses = [
            f"你说'{message}'是什么意思?",
            f"嗯,关于'{message}'我需要想想...",
            f"'{message}'很有趣!我们来聊点别的吧。",
            "我明白了,请继续。",
            "这个话题真深奥,能具体解释一下吗?"
        ]
        return f"{self.name}: {random.choice(responses)}"

async def chat_stream(bot, messages):
    for message in messages:
        response = await bot.generate_response(message)
        yield response

async def main():
    bot = ChatBot("AI助手")
    user_messages = [
        "你好!",
        "今天天气真不错",
        "你对人工智能的发展有什么看法?",
        "谢谢你的回答"
    ]

    chat_generator = chat_stream(bot, user_messages)

    try:
        while True:
            response = await anext(chat_generator)
            print(f"用户: {user_messages.pop(0)}")
            print(response)
            print()
    except StopAsyncIteration:
        print("对话结束")

if __name__ == "__main__":
    asyncio.run(main())

这个示例展示了如何使用异步技术创建一个简单的聊天机器人。它使用了async/await、异步生成器(yield)、anext()StopAsyncIteration异常处理。

运行这段代码,你将看到一个模拟的异步对话过程,机器人会在不同的延迟后回复消息。

总结

通过本文,我们深入探讨了Python中的几种重要的异步编程技术。这些技术可以帮助我们编写高效的异步代码,特别适用于I/O密集型应用。在实际开发中,合理使用这些技术可以显著提高程序的性能和响应速度。

标签:异步,await,Python,anext,print,async,def,asyncio
From: https://blog.csdn.net/engchina/article/details/140146566

相关文章

  • Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用|附代码数据
    原文链接:http://tecdat.cn/?p=24407最近我们被客户要求撰写关于金融时间序列模型的研究报告,包括一些图形和统计输出。这篇文章讨论了自回归综合移动平均模型(ARIMA)和自回归条件异方差模型(GARCH)及其在股票市场预测中的应用 ( 点击文末“阅读原文”获取完整代码数据******......
  • 还在为如何学Python而犯难吗?在这里分享下最全的Python学习路线!
    先是Python基础知识的看完基础的,那就来进阶的,前面的是入门,现在的也就是作为一个程序员的基础最后在来个爬虫的觉得有用的朋友,记得点赞哟,如果觉得还看得不过瘾,可以私信我,我这里有Python爬虫系统教学的免费直播观看名额或者还想看其他知识点的,可以在下面留言。......
  • Python学习篇:流程控制详细介绍(四)
    目录1前言2条件判断2.1基本语法2.2使用示例2.3注意事项3循环3.1for循环3.2while循环3.3循环控制语句 4异常处理 4.1基本语法4.2使用示例 4.3注意事项 1前言Python中的流程控制是编程中非常重要的一部分,它允许你根据条件、循环或其他因素来......
  • 超详细Python教程——函数和模块的使用
    函数和模块的使用在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。可以用Python的程序来计算出这个值,代码如下所示。"""......
  • 一个用来画拉氏图的简单Python脚本
    技术背景关于拉氏图的更多介绍,可以参考下这篇博客,这里简单引述一部分内容:Ramachandranplot(拉氏图)是由G.N.Ramachandran等人于1963年开发的,用来描述蛋白质结构中氨基酸残基二面角\(\psi\)和\(\phi\)是否在合理区域的一种可视化方法。同时也可以反映出该蛋白质的构象是否合理......
  • Python多线程-线程池ThreadPoolExecutor
    1.线程池不是线程数量越多,程序的执行效率就越快。线程也是一个对象,是需要占用资源的,线程数量过多的话肯定会消耗过多的资源,同时线程间的上下文切换也是一笔不小的开销,所以有时候开辟过多的线程不但不会提高程序的执行效率,反而会适得其反使程序变慢,得不偿失。为了防止无尽的线程......
  • Python的垃圾回收机制
    Python的垃圾回收机制引入计数器为主,标记清除和分代回收为辅1.引入计数器环状双向链表refchain在python程序中创建的任何对象都会放在refchain链表中当python程序运行时,会根据数据类型的不同找到其对应的结构体,根据结构体中的字段来进行创建相关的数据,然后将对象添加到rec......
  • python中logging
    Python的logging模块是一个用于记录应用程序日志消息的标准模块。它非常强大且灵活,允许你记录各种级别的日志消息,并配置输出格式、日志的存储位置以及处理日志的不同方式。以下是logging模块的基本介绍和用法。defcreate_logger(log_file):log_format='%(asctime)s......
  • 为什么现在的AI编程师都是用Python来编程?
    前言: 在当今AI大火的时节,涌入了一大批AI编程师,和AI训练师!显而易见他们都是用的Python语言来编程的。当然AI也给我们的工作带来了很多便利,比如AI绘画,写文章,视频剪辑,脚本创做等等方面现在都可以来用AI来协助我高效完成工作。那么我们来看看现在的AI编程师为什么都用Python语言......
  • python基础汇总(1)
    开始可以借鉴阿里腾讯开发规范——实际中运用会大体相近1、注释#:单行注释‘’‘’‘’或者“”“”“”:多行注释2、标识符合法:ABC、ABC_123、姓名、_123不合法:123、1ABC、if(保留字)、init(预定义标识符)(1)当标识符用作模块名时,应尽量短小,并且全部使用小写字母,可以使......