Python中async await的使用例子

import asyncio

async def slow_operation(n): await asyncio.sleep(n) print(‘Slow operation {} complete’.format(n)) return n

loop = asyncio.get_event_loop() done, _ = loop.run_until_complete( asyncio.wait([ slow_operation(1), slow_operation(2), slow_operation(9), slow_operation(2), slow_operation(1), slow_operation(2), slow_operation(3), ])) for fut in done: print(“return value is {}”.format(fut.result()))

Slow operation 1 complete
Slow operation 1 complete
Slow operation 2 complete
Slow operation 2 complete
Slow operation 2 complete
Slow operation 3 complete
Slow operation 9 complete
return value is 2
return value is 1
return value is 2
return value is 1
return value is 9
return value is 3
return value is 2


Python中async await的使用例子

1 回复

import asyncio
import aiohttp
from datetime import datetime

# 异步获取网页内容
async def fetch_url(session, url):
    try:
        async with session.get(url, timeout=10) as response:
            html = await response.text()
            return f"{url}: {len(html)} bytes"
    except Exception as e:
        return f"{url}: Error - {str(e)}"

# 主异步函数
async def main():
    urls = [
        'https://httpbin.org/get',
        'https://api.github.com',
        'https://docs.python.org'
    ]
    
    # 创建aiohttp会话
    async with aiohttp.ClientSession() as session:
        # 创建任务列表
        tasks = [fetch_url(session, url) for url in urls]
        
        # 并发执行所有任务
        print(f"开始时间: {datetime.now().strftime('%H:%M:%S')}")
        results = await asyncio.gather(*tasks)
        
        # 输出结果
        for result in results:
            print(result)
        print(f"结束时间: {datetime.now().strftime('%H:%M:%S')}")

# 运行异步程序
if __name__ == "__main__":
    asyncio.run(main())

这个例子展示了async/await的核心用法:

  1. 定义异步函数:用async def声明异步函数,里面可以用await调用其他异步操作

  2. await关键字:在await response.text()这里,程序会挂起当前协程,让出控制权给事件循环,直到这个IO操作完成

  3. 并发执行asyncio.gather()同时启动多个协程任务,实现真正的并发IO操作

  4. 事件循环asyncio.run()创建和管理事件循环

关键点:async/await不是多线程,而是单线程下的协程并发,特别适合IO密集型任务。函数被await调用时会暂停但不阻塞线程,事件循环可以调度其他协程运行。

建议:用asyncio处理网络请求、文件读写等IO等待场景。

回到顶部