python第十一课:并发编程 | 多任务交响乐团

news2025/3/3 22:35:57

🎯 本节目标

  • 理解多线程/多进程/协程的应用场景
  • 掌握threading与multiprocessing核心用法
  • 学会使用asyncio进行异步编程
  • 开发实战项目:高并发爬虫引擎
  • 破解GIL锁的性能迷思

1️⃣ 并发编程三剑客

在这里插入图片描述

🎻 生活化比喻:

  • 多线程 → 餐厅多个服务员共享厨房
  • 进程 → 连锁餐厅各自独立分店
  • 协程 → 一个服务员同时处理多桌点餐

2️⃣ 多线程实战:闪电下载器

import threading  
import requests  

def download(url, filename):  
    print(f"🚀 开始下载 {filename}")  
    data = requests.get(url).content  
    with open(filename, 'wb') as f:  
        f.write(data)  
    print(f"✅ {filename} 下载完成")  

# 创建线程列表  
threads = []  
urls = [  
    ('https://example.com/1.jpg', 'pic1.jpg'),  
    ('https://example.com/2.mp4', 'video.mp4')  
]  

for url, name in urls:  
    t = threading.Thread(target=download, args=(url, name))  
    threads.append(t)  
    t.start()  

# 等待所有线程完成  
for t in threads:  
    t.join()  
print("🎉 所有下载任务完成!")  

3️⃣ 协程魔法:异步爬虫引擎

import asyncio  
import aiohttp  

async def async_fetch(session, url):  
    async with session.get(url) as response:  
        return await response.text()  

async def main():  
    async with aiohttp.ClientSession() as session:  
        tasks = [  
            async_fetch(session, f"https://api.example.com/data/{i}")  
            for i in range(100)  
        ]  
        results = await asyncio.gather(*tasks)  
        print(f"📊 获取到 {len(results)} 条数据")  

# Python 3.7+ 使用 asyncio.run()  
asyncio.run(main())  

4️⃣ GIL锁:性能瓶颈与突破

🔒 GIL(全局解释器锁)真相

  • 单进程中同一时间只有一个线程执行字节码
  • 单进程中同一时间只有一个线程执行字节码
    破解方案:
# 使用多进程绕过GIL限制  
from multiprocessing import Pool  

def heavy_compute(n):  
    return sum(i*i for i in range(n))  

with Pool(4) as p:  
    results = p.map(heavy_compute, [10**6]*4)  

5️⃣ 实战项目:智能并发爬虫

import concurrent.futures  
import requests  

def advanced_crawler(urls, max_workers=5):  
    """智能并发爬虫"""  
    with concurrent.futures.ThreadPoolExecutor(max_workers) as executor:  
        future_to_url = {  
            executor.submit(requests.get, url): url  
            for url in urls  
        }  
        for future in concurrent.futures.as_completed(future_to_url):  
            url = future_to_url[future]  
            try:  
                data = future.result()  
                print(f"🌐 {url} 抓取成功(长度:{len(data.text)})")  
            except Exception as e:  
                print(f"❌ {url} 抓取失败:{str(e)}")  

# 使用示例  
url_list = [f"https://example.com/page/{i}" for i in range(50)]  
advanced_crawler(url_list, max_workers=10)  

📚 知识图谱

并发编程决策树:
               ┌───────────────┐  
               │   任务类型?   │  
               └───────┬───────┘  
          ┌────────────┴────────────┐  
    ┌─────▼─────┐            ┌──────▼──────┐  
    │ I/O密集型  │            │ CPU密集型    │  
    └─────┬─────┘            └──────┬──────┘  
   ┌──────▼──────┐           ┌──────▼──────┐  
   │ 多线程/协程 │           │   多进程     │  
   └─────────────┘           └─────────────┘  

PyCharm并发调试技巧:  
 1. 线程/进程ID显示:View → Toolbar → Show Threads  
 2. 协程堆栈追踪:async堆栈模式切换  
 3. 内存/CPU监控:右键状态栏 → 勾选Memory Indicator  

🛠️ 课后挑战

  1. 使用生产者-消费者模式实现多线程任务队列
  2. 将异步爬虫改造为支持断点续传
  3. 用多进程计算100个1e6大小随机数组的标准差

💡 参考答案提示:

# 生产者-消费者模型核心  
import queue  

task_queue = queue.Queue(maxsize=100)  

def producer():  
    while True:  
        item = generate_item()  
        task_queue.put(item)  

def consumer():  
    while True:  
        item = task_queue.get()  
        process_item(item)  
        task_queue.task_done()  

🚀 下节剧透:《网络编程:连接世界的数字桥梁

👉 你将解锁:

  • TCP/UDP协议底层原理
  • Socket编程实战技巧
  • HTTP服务器从零实现
  • 实战:即时聊天系统开发

📢 互动任务:在评论区分享你遇到过的并发难题,点赞最高的问题将获得《Python并发编程实战》实体书!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行,无需一行 Java/Scala 代码,也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业,包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…

解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server

当使用 MySQL 时,您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上,服务器还没有配置为接受来自相关主机的连接。 Common Caus…

科普|无人机专业术语

文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态,电调控制电机转速,遥控器通道控制飞行动作。电池C…

Qt:窗口

目录 菜单栏 QMenuBar 菜单添加快捷键 添加子菜单 添加分割线和添加图标 QMenuBar创建方式 工具栏 QToolBar 和菜单栏搭配 创建多个工具栏 状态栏 QStatusBar 状态栏中添加其他控件 浮动窗口 QDockWidget 对话框 对话框的内存释放问题 自定义对话框界面 模态对话…

深入浅出 Go 语言:协程(Goroutine)详解

深入浅出 Go 语言:协程(Goroutine)详解 引言 Go 语言的协程(goroutine)是其并发模型的核心特性之一。协程允许你轻松地编写并发代码,而不需要复杂的线程管理和锁机制。通过协程,你可以同时执行多个任务,并…

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

实验:k8s+keepalived+nginx+iptables

1、创建两个nginx的pod,app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理,VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…

LlamaFactory-webui:训练大语言模型的入门级教程

LlamaFactory是一个开源框架,支持多种流行的语言模型,及多种微调技术,同时,以友好的交互式界面,简化了大语言模型的学习。 本章内容,从如何拉取,我已经搭建好的Llamafactory镜像开始&#xff0…

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中,使用蓝牙电话拦截手机通话的声音,并对数据加工,这个功能出来也有一段时间了。前段时间有试用的用户咨询说:有没有办法在手机上&#xff…

基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践

目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…

【Qt】详细介绍如何在Visual Studio Code中编译、运行Qt项目

Visual Studio Code一只用的顺手,写Qt的时候也能用VS Code开发就方便多了。 理论上也不算困难,毕竟Qt项目其实就是CMake(QMake的情况这里就暂不考虑了)项目,VS Code在编译、运行CMake项目还是比较成熟的。 这里笔者打…

本地部署大语言模型-DeepSeek

DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理、代码生成等深度能力,堪称"AI界的六边形战士"。 Hostease AMD 9950X/96G/3.84T NVMe/1G/5IP/RTX4090 GPU服务器提供多种计费模式。 DeepSeek-R1-32B配置 配置项 规…

SQLAlchemy系列教程:SQLAlchemy快速入门示例项目

SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单,并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程,包括安装依赖包,创建连…

【Linux网络#10】:Https协议原理

📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 生活总是不会一帆风顺&#xf…

蓝桥杯备考:记忆化搜索之function

这道题是有重复的问题的&#xff0c;所以我们可以选择记忆化搜索 #include <iostream> using namespace std; typedef long long LL; const int N 25; LL ret[N][N][N]; LL dfs(LL a,LL b, LL c) {if(a<0 || b<0 || c<0) return 1;if(a>20 || b>20 || c…

mysql 全方位安装教程

下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包&#xff0c;小的安装包是一个安装器。 我们不用登录&#xff0c;直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…

设计模式Python版 观察者模式

文章目录 前言一、观察者模式二、观察者模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组…

如何在Python用Plot画出一个简单的机器人模型

如何在Python中使用 Plot 画出一个简单的模型 在下面的程序中&#xff0c;首先要知道机器人的DH参数&#xff0c;然后计算出每一个关节的位置&#xff0c;最后利用 plot 函数画出关节之间的连杆就可以了&#xff0c;最后利用 animation 库来实现一个动画效果。 import matplo…

如何使用ArcGIS Pro制作横向图例:详细步骤与实践指南

ArcGIS Pro&#xff0c;作为Esri公司推出的新一代地理信息系统&#xff08;GIS&#xff09;平台&#xff0c;以其强大的功能和灵活的操作界面&#xff0c;在地理数据处理、地图制作和空间分析等领域发挥着重要作用。 在地图制作过程中&#xff0c;图例作为地图的重要组成部分&…

【Python 数据结构 3.顺序表】

目录 一、顺序表基本概念 1.顺序表的概念 2.顺序表的元素插入 元素插入的步骤 3.顺序表的元素删除 元素删除的步骤 4.顺序表的元素查找 元素查找的步骤 5.顺序表的元素索引 元素索引的步骤 6.顺序表的元素修改 元素修改的步骤 二、Python中的顺序表 1.顺序表的定义 2.顺序表的插…