)
目录Python进阶教程异步编程asyncio一、什么是异步编程二、协程基础三、并发执行多个任务四、asyncio.create_task五、异步 HTTP 请求六、asyncio 与同步代码混合七、超时与取消八、实战异步下载器总结Python进阶教程异步编程asyncio本文是Python 入门教程系列的第 12 篇扩展篇。前面第 6 篇介绍了多线程与多进程本篇讲解异步编程asyncio它是 I/O 密集任务最高效的并发方案。一、什么是异步编程异步编程让程序在等待 I/O 时不阻塞而是继续执行其他任务。与多线程相比单线程内实现并发无锁竞争上下文切换开销极小适合大量 I/O 等待场景网络请求、数据库Python 3.7 使用async/await关键字。二、协程基础importasyncioasyncdefhello():print(开始执行)awaitasyncio.sleep(1)# 模拟异步等待print(执行完成)# 运行协程asyncio.run(hello())三、并发执行多个任务importasyncioimporttimeasyncdeffetch(name,delay):print(f{name}开始请求...)awaitasyncio.sleep(delay)print(f{name}完成)returnf{name}的数据asyncdefmain():starttime.perf_counter()# 并发执行多个协程resultsawaitasyncio.gather(fetch(请求A,2),fetch(请求B,1),fetch(请求C,3),)print(results)print(f总耗时{time.perf_counter()-start:.1f}s)# 约 3s 而非 6sasyncio.run(main())四、asyncio.create_taskimportasyncioasyncdefworker(name,delay):awaitasyncio.sleep(delay)returnf{name}完成asyncdefmain():# 创建任务不立即 await让它们并行task1asyncio.create_task(worker(任务1,2))task2asyncio.create_task(worker(任务2,1))# 等待所有任务resultsawaitasyncio.gather(task1,task2)print(results)asyncio.run(main())五、异步 HTTP 请求配合 aiohttp 库实现真正的异步网络请求# pip install aiohttpimportasyncioimportaiohttpimporttimeasyncdeffetch_url(session,url):asyncwithsession.get(url)asresp:returnawaitresp.text()asyncdefmain():urls[https://httpbin.org/get]*5asyncwithaiohttp.ClientSession()assession:starttime.perf_counter()# 并发请求responsesawaitasyncio.gather(*(fetch_url(session,url)forurlinurls))print(f完成{len(responses)}个请求耗时{time.perf_counter()-start:.2f}s)asyncio.run(main())六、asyncio 与同步代码混合importasyncioimporttimedefsync_blocking():模拟阻塞操作如 CPU 计算、旧库调用time.sleep(2)return同步结果asyncdefmain():print(开始)# 用 run_in_executor 把阻塞操作丢到线程池loopasyncio.get_running_loop()resultawaitloop.run_in_executor(None,sync_blocking)print(result)asyncio.run(main())七、超时与取消importasyncioasyncdefslow_task():awaitasyncio.sleep(10)return终于完成了asyncdefmain():try:# 3 秒超时resultawaitasyncio.wait_for(slow_task(),timeout3)print(result)exceptasyncio.TimeoutError:print(任务超时已取消)asyncio.run(main())# 任务超时已取消八、实战异步下载器importasyncioimportaiohttpimporttimeasyncdefdownload(session,index):模拟异步下载文件awaitasyncio.sleep(index*0.3)returnf文件{index}下载完成asyncdefmain():asyncwithaiohttp.ClientSession()assession:starttime.perf_counter()tasks[download(session,i)foriinrange(1,8)]resultsawaitasyncio.gather(*tasks)forrinresults:print(r)print(f总耗时{time.perf_counter()-start:.2f}s)asyncio.run(main())总结本篇介绍了 asyncio 的协程、任务并发、异步 HTTP、超时控制等核心概念并提供了异步下载器实战。选择并发方案的建议I/O 密集用 asyncio最高效或多线程CPU 密集用多进程。