当前位置:首页 > 技术文章 > 正文内容

浅谈下Python中的async,await_python的async await

zonemu1个月前 (09-04)技术文章16

最近在看一些开源代码中,经常会看到Python代码里面总有一些async,await之类的语法,难道我是老古董,之前没见过这种玩法?不过这玩意究竟能干点啥?还是自己亲身体验下才能理解深刻。

Python中的async和await是实现异步编程的关键语法,它们基于协程(coroutine)机制,让你可以在不使用传统线程和锁的情况下编写高效的并发代码。

异步编程允许程序在等待 I/O 操作(如网络请求、文件读写)完成时继续执行其他任务,而不是阻塞等待。这特别适合 I/O 密集型 场景(如爬虫、API 调用)。

下面是我使用python调用ollama API,对async功能进行测试:

这里我使用本地的Ollama API接口,现有模型如下:

使用requests的经典调用方式:

import requests

url = "http://10.133.254.123:11434/api/generate"
data = {
    "model": "qwen2.5:7b",
    "prompt": "鱼香肉丝的做法",
    "stream": False
}
response = requests.post(url, json=data)
if response.status_code == 200:
    result = response.json()
    print("生成的文本:", result.get("response"))
else:
    print("请求失败,状态码:", response.status_code)
    print("错误信息:", response.text)

我在jupyter中跑出来的效果

下面是使用async后的

import asyncio
import aiohttp

async def call_ollama_async():
    url = "http://localhost:11434/api/generate"
    data = {
        "model": "deepseek-r1:8b",
        "prompt": "菠萝咕咾肉怎么做好吃?",
        "stream": False
    }
    async with aiohttp.ClientSession() as session:
        async with session.post(url, json=data) as response:
            if response.status == 200:
                result = await response.json()
                print("异步生成的文本:", result.get("response"))
            else:
                print("请求失败,状态码:", response.status)
                print("错误信息:", await response.text())

asyncio.run(call_ollama_async())

这个直接在Jupyter中执行有报错:

asyncio.run() cannot be called from a running event loop

查了下出错原因,难道是在Jupyter中运行出现了嵌套调用?

  • 避免嵌套调用:永远不要在一个已经运行的事件循环中调用 asyncio.run()。
  • 使用 await 或 asyncio.gather():在异步函数中调用其他异步函数时,使用 await 或创建任务来并发执行。
  • 多线程作为最后手段:只有在确实需要独立运行事件循环时,才考虑在新线程中创建事件循环。

将代码保存成py文件,使用python执行没有问题,效果如下:

直接结果:

当需要同时向 Ollama 接口发起多个请求时,async/await的优势就凸显出来了,如:

async def multiple_calls():
    tasks = []
    prompts = ["鱼香肉丝做法", "菠萝咕咾肉做法", "糖醋排骨的做法"]
    for prompt in prompts:
        task = asyncio.create_task(call_ollama_async(prompt))
        tasks.append(task)
    await asyncio.gather(*tasks)

使用async await函数还有其他优点:

  • 代码可读性增强

对比同步代码和异步代码,async/await让异步代码的结构更接近同步代码的书写方式。

  • 更好的错误处理

在异步函数中,可以使用try/except块来捕获异常,与同步代码的错误处理方式一致。

概括来说,在API调用场景中,使用async,await方式会有更好的效率,也让你写出的代码更像一位高手!

(本文完)

相关文章

费用管理系统(BMS)(费用管理系统的好处)

随着物流仓储行业的快速发展,费用管理系统的应用愈发重要。BMS系统不仅简化了报价与结算流程,还降低了管理成本,提升了效率。本文深入探讨了海外仓BMS系统的功能与应用,展示了其在费用管理中的重要作用,为...

用IDEA开发如何用Git快速拉取指定分支代码?

1,准备空的文件夹,git init2,关联远程仓库,git remote add origin gitlab地址3,拉取远程分支代码,git pull origin 远程分支名再用IDEA打开项目即...

全屋定制板材怎么选不出错?6 种板材深度对比,3 套方案闭眼选

装修选板材头疼吧?刚装完的柜子变形发霉,说好的环保结果甲醛超标,这种翻车现场见太多了。厨房卫生间千万别用密度板,这玩意儿遇水就膨胀,半年准完蛋。颗粒板性价比确实高,但小厂出的真心不敢用。环保等级至少得...

JavaScript 数组的常用方法(javascript数组的常用方法)

在我们前端来说数组作为一个常用的类型,今天我们讲一下在实际使用中经常用到的方法和使用场景。concat() 多数组组合concat() 可以用来连接两个或多个数组,返回要给新的数组并且不会影响之前的数...

Excel中的FILTER函数详细介绍及使用示例

在Excel中处理大量数据时,经常需要根据特定条件筛选出符合条件的数据行或列。这正是Excel的FILTER函数发挥作用的地方。FILTER函数是Excel中一个非常强大的工具,它可以基于一个或多个条...

2021系列——JavaScript比较数组的7种方法

本文我会介绍一些基于Property值对数组进行排序的方法,希望这些技巧能够对你2021年的JS代码编写有点点帮助。多多少少在JS中,我们会碰到某种方式来比较两个对象数组并找出差异,当然也可能是比较并...