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

🎯 本节目标

  • 理解多线程/多进程/协程的应用场景
  • 掌握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并发编程实战》实体书!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux中断调用流程(arm)

文章目录 ARM架构下Linux中断处理全流程解析:从硬件触发到驱动调用 ⚡**一、中断触发与硬件层响应** 🔌**1. 设备触发中断** 📡 **二、CPU阶段:异常入口与上下文处理** 🖥️**1. 异常模式切换** 🔄**2. 跳转…

Deepseek 模型蒸馏

赋范课堂: https://www.bilibili.com/video/BV1qUN8enE4c/

商城系统单商户开源版源码

环境配置 1.软件安装 宝塔安装系统软件:Nginx、MySQL5.6、PHP( PHP用7.1-7.4版本)、phpMyAdmin(Web端MySQL管理工具)。 2.配置mysql 设置mysql,在已安装的软件里面找到 mysql点击进行设置 3.修改sql-mode 选择左侧配置修改,找到里面的sql-mode&…

登录日志管理:通用分页和排序封装、 查询登录日志列表、删除登录日志、清空登录日志、解锁用户登录状态(解锁密码错误次数超限)

文章目录 引言I 登录日志管理接口列表II 通用分页和排序封装Java 分页和排序封装vue前端排序页面III 工具类字段名转换 : 驼峰转下划线命名引言 I 登录日志管理 接口列表 import request from @/utils/request// 查询登录日志列表 export function list(query) {return

Java内存管理与性能优化实践

Java内存管理与性能优化实践 Java作为一种广泛使用的编程语言,其内存管理和性能优化是开发者在日常工作中需要深入了解的重要内容。Java的内存管理机制借助于垃圾回收(GC)来自动处理内存的分配和释放,但要实现高效的内存管理和优…

Flutter_学习记录_实现列表上拉加载更多的功能

可以用ScrollController组件来实现这样列表上拉加载更多的功能: 1. 定义变量 在StatefulWidget 的组件内,添加三个属性: // 滚动视图的控制器final ScrollController _scrollController ScrollController();// 是否已显示了上拉加载中bool _isShowM…

使用DeepSeek+KIMI生成高质量PPT

一、使用DeepSeek DeepSeek官网:DeepSeek 点击“开始对话”,进入交互页面。 在上图中,输入问题,即可获取AI生成的结果。 基础模型(V3):通用模型(2024.12),高…

TCP和UDP比较

以下是 TCP(传输控制协议) 和 UDP(用户数据报协议) 的详细对比,涵盖核心特性、应用场景及技术差异: 1. 核心特性对比 特性TCPUDP连接方式面向连接(需三次握手建立连接)无连接&#…

Spring Boot 3.x 基于 Redis 实现邮箱验证码认证

文章目录 依赖配置开启 QQ 邮箱 SMTP 服务配置文件代码实现验证码服务邮件服务接口实现执行流程 依赖配置 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…

(七)消息队列-Kafka 序列化avro(传递)

&#xff08;七&#xff09;消息队列-Kafka 序列化avro&#xff08;传递&#xff09; 客从远方来&#xff0c;遗我双鲤鱼。呼儿烹鲤鱼&#xff0c;中有尺素书。 ——佚名《饮马长城窟行》 本文已同步CSDN、掘金平台、知乎等多个平台&#xff0c;图片依然保持最初发布的水印&…

Docker 学习(一)

一、Docker 核心概念 Docker 是一个开源的容器化平台&#xff0c;允许开发者将应用及其所有依赖&#xff08;代码、运行时、系统工具、库等&#xff09;打包成一个轻量级、可移植的“容器”&#xff0c;实现 “一次构建&#xff0c;随处运行”。 1、容器&#xff08;Container…

使用mermaid查看cursor程序生成的流程图

一、得到cursor生成的流程图文本 cursor写的程序正常运行后&#xff0c;在对话框输入框中输入诸如“请生成扫雷的代码流程图”&#xff0c;然后cursor就把流程图给生成了&#xff0c;但是看到的还是文本的样子&#xff0c;保留这部分内容待用 二、注册一个Mermaid绘图账号 …

蜂鸣器使用

1、蜂鸣器原理 无源蜂鸣器模块根据输入的 不同方波信号&#xff08;作为震荡源&#xff09;可以发出不同的声音。驱动电路中三极管电阻一般为1K-4K都行&#xff0c;能够让三极管导通即可。&#xff08;三极管即带箭头的部分&#xff0c;基极和发射机&#xff08;PNP&#xff09…

15. LangChain实战项目2——易速鲜花海报文案生成

你已经制作好了一批鲜花的推广海报&#xff0c;想为每一个海报的内容&#xff0c;写一两句话&#xff0c;然后 post 到社交平台上&#xff0c;以期图文并茂。 下载 Salesforce/blip-image-captioning-large 图生文模型 通过以下几个命令下载该模型 pip install -U huggingfa…

支持IPD项目管理的9大系统,哪款工具能有效提高项目控制能力

本文介绍了以下9大系统: 1.Worktile&#xff1b; 2. 腾讯敏捷开发平台&#xff08;TAPD&#xff09;&#xff1b; 3. 简道云&#xff08;Jiandaoyun&#xff09;&#xff1b; 4. 蓝鲸智云&#xff08;BlueWhale&#xff09;&#xff1b; 5. 轻流&#xff08;Qingflow&#xff0…

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…

Linux之yum详解

—— 小 峰 编 程 目录 1、Linux软件的安装方式 2、什么是yum 3、配置网络yum源 4、yum命令 【语法】 【yum常用命令】 1、Linux软件的安装方式 在CentOS系统中&#xff0c;软件管理方式通常有三种方式&#xff1a; rpm安装 、 yum安装 以及 编译安装 。 2、什么是yum…

2025国家护网HVV高频面试题总结来了01(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4 高频面试题第四套 0x5 高频面…

leetcode 59. 螺旋矩阵 II 中等

给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a;n 1 输出&am…

基于Rook的Ceph云原生存储部署与实践指南(下)

#作者&#xff1a;任少近 文章目录 6Ceph资源对像管理6.1查看services6.2查看Jobs6.3 查看deployments.apps6.4查看daemonsets.apps6.5查看configmaps6.6查看clusterroles.rbac.authorization.k8s.io6.7查看clusterrolebindings.rbac.authorization.k8s.io6.8通过cephclusters…