0

0

Python并发系统学习路线第255讲_核心原理与实战案例详解【指导】

舞姬之光

舞姬之光

发布时间:2025-12-25 21:57:08

|

524人浏览过

|

来源于php中文网

原创

python并发的核心难点在于任务调度、状态共享与i/o阻塞点控制,而非语法本身;需区分i/o密集型(用asyncio)与cpu密集型(用multiprocessing),并严格管理线程/进程/事件循环边界及资源安全。

python并发系统学习路线第255讲_核心原理与实战案例详解【指导】

Python 并发不是靠“多开几个线程”就能解决的,真正卡住人的从来不是 threadingasyncio 的语法,而是任务调度时机、状态共享边界、I/O 阻塞点是否真的被绕过——第255讲这个编号本身没意义,但背后暴露的问题很真实:很多人学完 ThreadPoolExecutor 还是写不出稳定爬虫,跑通 async def 仍会遇到 RuntimeError: Event loop is closed

为什么 concurrent.futures.ThreadPoolExecutor 跑着跑着就卡死?

这不是线程池坏了,而是你没管住「阻塞源」。常见于混合使用同步 I/O(比如 requests.get())和线程池时,未设超时、未捕获异常、或共享了非线程安全对象(如全局 sqlite3.Connection)。

  • max_workers 设太高反而触发系统级连接数限制(尤其 HTTP),建议从 min(32, os.cpu_count() + 4) 起调
  • 务必给每个 submit() 包裹 try/except,否则一个任务崩溃会导致 as_completed() 提前退出
  • 避免在线程内复用单例 Session(如 requests.Session()),每个线程应持有一个独立实例

asyncio.run() 为什么不能在已运行的 event loop 里调用?

这是初学者最常撞上的墙:RuntimeError: asyncio.run() cannot be called from a running event loop。根本原因是 Python 的 event loop 是 per-thread 且不可重入的——你在 Jupyter、FastAPI 中间件、或已启动的 asyncio.create_task() 里再调 asyncio.run(),等于试图嵌套启动主循环。

  • 替代方案:用 asyncio.create_task() 提交协程,或直接 await 已有协程对象
  • Jupyter 中可用 await coro(需 IPython ≥ 7.0),而非强行 asyncio.run(coro)
  • 若必须从同步上下文进异步,且确定当前无 loop,才用 asyncio.run();否则检查是否已处于 async def 内部

什么时候该用 multiprocessing 而不是 asyncio

别被“异步更快”带偏。CPU 密集型任务(如图像处理、数值计算)用 asyncio 不仅没提速,还会因协程切换增加开销。真正的分水岭在「等待 vs 计算」:

Sesame AI
Sesame AI

一款开创性的语音AI伴侣,具备先进的自然对话能力和独特个性。

下载

立即学习Python免费学习笔记(深入)”;

  • I/O 密集(HTTP 请求、数据库查询、文件读写)→ 优先 asyncio + aiohttp/aiomysql
  • CPU 密集(numpy 矩阵运算、PIL 图像缩放)→ 必须 multiprocessing,且注意 spawn 启动方式比 fork 更安全(尤其 Windows/macOS)
  • 混合场景(如下载+解析 HTML)→ 拆:下载用 asyncio,解析用 multiprocessing.Pool.map(),用 queue.Queuemultiprocessing.Queue 传数据
import asyncio
import aiohttp
from multiprocessing import Pool
<p>def cpu_heavy_task(data):</p><h1>纯计算,不 await,不 IO</h1><pre class='brush:python;toolbar:false;'>return sum(x ** 2 for x in data)

async def fetch_url(session, url): async with session.get(url) as resp: return await resp.text()

async def main(): urls = ["https://www.php.cn/link/5f69e19efaba426d62faeab93c308f5c"] 10 async with aiohttp.ClientSession() as session: htmls = await asyncio.gather([fetch_url(session, u) for u in urls])

# 把 HTML 列表交给多进程解析
with Pool() as pool:
    results = pool.map(cpu_heavy_task, [list(h.encode()) for h in htmls])
return results

并发系统的复杂性不在语法,而在你能否清晰画出「哪段代码在哪个线程/进程/event loop 里执行」「数据在哪儿被读写」「错误发生时控制权落在谁手里」。很多问题其实只需要加一行 print(f"pid={os.getpid()}, tid={threading.get_ident()}") 就能定位。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

182

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

251

2026.02.06

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

334

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

776

2023.10.18

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 847人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号