Python开发从入门到精通:异步编程进阶与asyncio高级应用

Python开发从入门到精通:异步编程进阶与asyncio高级应用

《Python开发从入门到精通》设计指南第二十七篇:异步编程进阶与asyncio高级应用

在这里插入图片描述

一、学习目标与重点

💡 学习目标:掌握Python异步编程的高级技巧,包括协程调度、任务管理、异步IO操作、并发控制等;学习asyncio库的高级应用;通过实战案例开发异步应用程序。
⚠️ 学习重点:协程调度、任务管理、异步IO操作、并发控制、asyncio高级应用、异步应用实战。

27.1 异步编程概述

27.1.1 什么是异步编程

异步编程是一种编程模型,通过非阻塞的方式处理IO操作,提高应用程序的并发性能。在异步编程中,任务可以在等待IO操作完成时继续执行其他任务,而不需要阻塞等待。

27.1.2 异步编程的优势

  • 高性能:通过非阻塞的方式处理IO操作,提高应用程序的并发性能。
  • 高并发:可以同时处理大量的IO操作,提高应用程序的吞吐量。
  • 简单易用:使用协程和异步IO操作,代码可读性高。

27.2 asyncio库的高级应用

27.2.1 协程调度

import asyncio asyncdeftask1():print("Task 1 start")await asyncio.sleep(1)print("Task 1 end")asyncdeftask2():print("Task 2 start")await asyncio.sleep(2)print("Task 2 end")asyncdefmain():print("Main start")await asyncio.gather(task1(), task2())print("Main end")if __name__ =="__main__": asyncio.run(main())

27.2.2 任务管理

import asyncio asyncdeftask1():print("Task 1 start")await asyncio.sleep(1)print("Task 1 end")asyncdeftask2():print("Task 2 start")await asyncio.sleep(2)print("Task 2 end")asyncdefmain():print("Main start") task1_obj = asyncio.create_task(task1()) task2_obj = asyncio.create_task(task2())await task1_obj await task2_obj print("Main end")if __name__ =="__main__": asyncio.run(main())

27.2.3 异步IO操作

import asyncio import aiohttp asyncdeffetch(session, url):asyncwith session.get(url)as response:returnawait response.text()asyncdefmain():asyncwith aiohttp.ClientSession()as session: html =await fetch(session,"https://www.example.com")print(html)if __name__ =="__main__": asyncio.run(main())

27.2.4 并发控制

import asyncio import aiohttp from asyncio import Semaphore asyncdeffetch(session, url, sem):asyncwith sem:asyncwith session.get(url)as response:returnawait response.text()asyncdefmain(): urls =["https://www.example.com"]*10 sem = Semaphore(3)asyncwith aiohttp.ClientSession()as session: tasks =[asyncio.create_task(fetch(session, url, sem))for url in urls] results =await asyncio.gather(*tasks)for result in results:print(len(result))if __name__ =="__main__": asyncio.run(main())

27.3 实战案例:异步爬虫

27.3.1 需求分析

开发一个异步爬虫,支持以下功能:

  • 异步爬取多个网页。
  • 解析网页内容。
  • 保存爬取结果。
  • 并发控制。

27.3.2 代码实现

import asyncio import aiohttp from asyncio import Semaphore from bs4 import BeautifulSoup asyncdeffetch(session, url, sem):asyncwith sem:asyncwith session.get(url)as response:returnawait response.text()asyncdefparse(html): soup = BeautifulSoup(html,"html.parser") title = soup.find("title").text return title asyncdefsave_result(title, url):withopen("results.txt","a")as f: f.write(f"{title}\t{url}\n")asyncdefcrawl(url, session, sem):try: html =await fetch(session, url, sem) title =await parse(html)await save_result(title, url)print(f"Successfully crawled {url}")except Exception as e:print(f"Failed to crawl {url}: {e}")asyncdefmain(): urls =["https://www.example.com","https://www.google.com","https://www.github.com","https://www.python.org","https://www.djangoproject.com"] sem = Semaphore(3)asyncwith aiohttp.ClientSession()as session: tasks =[asyncio.create_task(crawl(url, session, sem))for url in urls]await asyncio.gather(*tasks)if __name__ =="__main__": asyncio.run(main())

27.3.3 实施过程

  1. 安装依赖:aiohttp、beautifulsoup4。
  2. 实现异步爬取和解析网页内容。
  3. 实现保存爬取结果。
  4. 实现并发控制。
  5. 运行应用。

27.3.4 最终效果

通过异步爬虫,我们可以实现以下功能:

  • 异步爬取多个网页。
  • 解析网页内容。
  • 保存爬取结果。
  • 并发控制。

27.4 实战案例:异步Web服务器

27.4.1 需求分析

开发一个异步Web服务器,支持以下功能:

  • 处理HTTP请求。
  • 异步读取文件。
  • 异步数据库操作。
  • 并发控制。

27.4.2 代码实现

import asyncio from aiohttp import web import aiofiles import sqlite3 from asyncio import Semaphore asyncdefread_file(file_path):asyncwith aiofiles.open(file_path,"r")as f:returnawait f.read()asyncdefget_data_from_db(): conn = sqlite3.connect("test.db") cursor = conn.cursor() cursor.execute("SELECT * FROM users") data = cursor.fetchall() conn.close()return data asyncdefindex(request): content =await read_file("index.html")return web.Response(text=content, content_type="text/html")asyncdefusers(request): sem = Semaphore(3)asyncwith sem: data =await get_data_from_db()return web.json_response(data)asyncdefcreate_app(): app = web.Application() app.add_routes([ web.get("/", index), web.get("/users", users)])return app if __name__ =="__main__": asyncio.run(web.run_app(create_app(), host="0.0.0.0", port=8000))

27.4.3 实施过程

  1. 安装依赖:aiohttp、aiofiles。
  2. 实现异步读取文件和数据库操作。
  3. 实现HTTP请求处理。
  4. 实现并发控制。
  5. 运行应用。

27.4.4 最终效果

通过异步Web服务器,我们可以实现以下功能:

  • 处理HTTP请求。
  • 异步读取文件。
  • 异步数据库操作。
  • 并发控制。

总结

✅ 本文详细介绍了Python异步编程的高级技巧,包括协程调度、任务管理、异步IO操作、并发控制等;学习了asyncio库的高级应用;通过实战案例开发了异步爬虫和异步Web服务器。
✅ 建议读者在学习过程中多练习,通过编写代码加深对知识点的理解。

Read more

ESP32 小智 AI 机器人入门教程从原理到实现(自己云端部署)

此博客为一篇针对初学者的详细教程,涵盖小智 AI 机器人的原理、硬件准备、软件环境搭建、代码实现、云端部署以及优化扩展。文章结合了现有的网络资源,取长补短,确保内容易于理解和操作。 简介: 本教程将指导初学者使用 ESP32 微控制器开发一个简单的语音对话机器人“小智”。我们将介绍所需的基础原理、硬件准备、软件环境搭建,以及如何编写代码实现语音唤醒和与云端大模型的对接。通过本教程,即使没有深厚的 AI 或嵌入式经验,也可以一步步制作出一个能听懂唤醒词并与人对话的简易 AI 机器人。本教程提供详细的操作步骤、代码示例和图示,帮助您轻松上手。 1. 基础原理 ESP32 架构及其在 AI 领域的应用: ESP32 是一款集成 Wi-Fi 和蓝牙的双核微控制器,具有较高的主频和丰富的外设接口,适合物联网和嵌入式 AI 应用。特别是新版的 ESP32-S3 芯片,不仅运行频率高达 240MHz,还内置了向量加速指令(

By Ne0inhk
Flutter 组件 bip340 适配鸿蒙 HarmonyOS 实战:次世代 Schnorr 签名,为鸿蒙 Web3 与隐私计算筑牢加密防线

Flutter 组件 bip340 适配鸿蒙 HarmonyOS 实战:次世代 Schnorr 签名,为鸿蒙 Web3 与隐私计算筑牢加密防线

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 bip340 适配鸿蒙 HarmonyOS 实战:次世代 Schnorr 签名,为鸿蒙 Web3 与隐私计算筑牢加密防线 前言 在鸿蒙(OpenHarmony)生态迈向去中心化金融(DeFi)、隐私通讯及安全资产管理等高阶安全场景的背景下,如何实现更高性能、更具扩展性且抗攻击能力的数字签名架构,已成为决定应用闭环安全性的“压舱石”。在鸿蒙设备这类强调分布式鉴权与芯片级安全(TEE/SE)的移动终端上,如果依然沿用传统的 ECDSA 签名算法,由于由于其固有的可延展性风险与高昂的聚合验证成本,极易由于由于在大规模节点验证时的 CPU 负载过高导致交互滞后。 我们需要一种能够实现签名线性聚合、计算逻辑极简且具备原生抗延展性的密码学方案。 bip340 为 Flutter 开发者引入了比特币 Taproot 升级的核心——Schnorr 签名算法。它不仅在安全性上超越了传统标准,更通过其线性的数学特性,

By Ne0inhk

Flutter 三方库 angular_bloc 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致响应、工业级的 AngularDart 与 BLoC 协同架构实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 angular_bloc 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致响应、工业级的 AngularDart 与 BLoC 协同架构实战 在鸿蒙(OpenHarmony)系统的桌面级协同(如分布式办公网页版)、后台管理终端或高度复杂的 Web 仪表盘开发中,如何将经典的 BLoC 状态管理应用于 AngularDart 环境?angular_bloc 为开发者提供了一套天衣无缝的组件化连接器。本文将实战演示其在鸿蒙 Web 生态中的深度应用。 前言 什么是 Angular BLoC?它是一套专门为 AngularDart 框架设计的 BLoC 实现。通过指令(Directives)和管道(Pipes),它实现了由于数据流变化触发的 UI

By Ne0inhk
【保姆级教程】从零入手:Python + Neo4j 构建你的第一个知识图谱

【保姆级教程】从零入手:Python + Neo4j 构建你的第一个知识图谱

摘要: 大数据时代,数据之间的关系往往比数据本身更有价值。传统的 SQL 数据库在处理复杂关系(如社交网络、推荐系统、风控分析)时显得力不从心,而 知识图谱 和 图数据库 Neo4j 正是为此而生。本文将带你从 0 基础出发,理解知识图谱核心概念,安装 Neo4j 环境,并手把手教你用 Python 代码构建一个生动的人物关系图谱。拒绝枯燥理论,全是实战干货! 一、 什么是知识图谱与 Neo4j? 在动手写代码之前,我们先用大白话把两个核心概念捋清楚。 1. 什么是知识图谱 (Knowledge Graph)? 不要被高大上的名字吓到。知识图谱本质上就是把世界上的事物(节点)和它们之间的联系(关系)画成一张巨大的网。 * Excel 思维: 罗列数据。例如:张三,25岁;李四,

By Ne0inhk