Ubuntu Python异步编程入门
Ubuntu 下 Python 异步编程入门指南

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
一 环境准备
想在 Ubuntu 上玩转异步编程,首先得把环境搭好。这里有几个关键步骤:
- Python 版本选择:强烈建议使用 Python 3.7 或更高版本。如果你的系统版本比较旧,可以通过添加 deadsnakes PPA 源来安装新版本。别忘了创建虚拟环境,它能帮你把项目依赖隔离得干干净净。
- 安装与准备
sudo apt update && sudo apt install -y python3 python3-pipsudo add-apt-repository ppa:deadsnakes/ppasudo apt install -y python3.10 python3.10-venv
- 创建虚拟环境
python3.10 -m venv .venvsource .venv/bin/activate
- 安装与准备
- 常用异步库
pip install aiohttp httpx
简单说明一下:asyncio 模块从 Python 3.4 开始引入,而我们现在熟悉的 async/await 语法则在 3.5 版本稳定下来。之所以推荐 3.7+,是因为从这个版本开始,提供了像 asyncio.run() 这样更简洁、更友好的程序入口,对新手来说门槛低了不少。
二 核心概念与第一个异步程序
理解了下面几个概念,异步编程的大门就算推开一半了。
- 关键概念
- 事件循环 (Event Loop):它是整个异步运行的心脏,负责调度和切换各个协程。
- 协程 (Coroutine):用
async def定义的函数,它的妙处在于能在等待时主动“让出”控制权。 - 任务 (Task):可以理解为对协程的包装,交给事件循环去并发调度。
- 可等待对象 (Awaitable):这是一个统称,协程、任务和 Future 都属于此类。
- 最小示例
- 顺序执行:让两个协程A和B依次运行,分别等待1秒和2秒,总耗时自然是3秒左右。
-
import asyncio async def say_delay(name, sec): print(f\"[{name}] start\") await asyncio.sleep(sec) print(f\"[{name}] done\") async def main(): await say_delay(“A”, 1) await say_delay(“B”, 2) if __name__ == “__main__”: asyncio.run(main())
-
- 并发执行:使用
asyncio.create_task将协程包装成任务,让它们并发跑起来。这样,总耗时就取决于最慢的那个任务,大约2秒。-
import asyncio async def say_delay(name, sec): print(f\"[{name}] start\") await asyncio.sleep(sec) print(f\"[{name}] done\") async def main(): t1 = asyncio.create_task(say_delay(“A”, 1)) t2 = asyncio.create_task(say_delay(“B”, 2)) await t1; await t2 if __name__ == “__main__”: asyncio.run(main())
-
- 顺序执行:让两个协程A和B依次运行,分别等待1秒和2秒,总耗时自然是3秒左右。
- 运行方式
- 记住这个标准流程:用
asyncio.run(main())作为程序入口;在协程内部,用await来等待其他可等待对象;想实现并发,就用create_task把协程调度成任务。
- 记住这个标准流程:用
三 实战 异步 HTTP 请求
理论懂了,来点实际的。异步编程最常见的场景之一就是并发处理网络请求。
- 使用 aiohttp 并发抓取多个站点
-
import asyncio, aiohttp async def download_site(url, session): async with session.get(url) as resp: print(f\"{url} -> {resp.status}\") async def main(): urls = [“https://example.com”, “https://example.org”] async with aiohttp.ClientSession() as session: tasks = [download_site(u, session) for u in urls] await asyncio.gather(*tasks) if __name__ == “__main__”: asyncio.run(main())
-
- 使用 httpx(支持同步/异步)
- 安装:
pip install httpx -
import asyncio, httpx async def fetch(url): async with httpx.AsyncClient() as client: r = await client.get(url) return r.status_code async def main(): urls = [“https://www.example.com”, “https://www.python.org”, “https://www.github.com”] results = await asyncio.gather(*[fetch(u) for u in urls]) for u, s in zip(urls, results): print(u, s) if __name__ == “__main__”: asyncio.run(main())
- 安装:
四 常见陷阱与最佳实践
掌握了基本操作,还得了解哪些坑要避开,以及如何写出更健壮的代码。
- 避免阻塞调用:这是新手最容易犯的错误。在协程里,千万别用
time.sleep、requests.get这类会阻塞整个线程的 API。正确的做法是换成await asyncio.sleep()和异步 HTTP 客户端(比如 aiohttp 或 httpx)。 - 控制并发度:无限制地并发请求,很容易把目标服务器或者自己的机器资源压垮。这时候,
asyncio.Semaphore信号量就是你的限流神器。-
import asyncio async def worker(i, sem): async with sem: print(f\"worker-{i} working\") await asyncio.sleep(1) async def main(): sem = asyncio.Semaphore(5) # 最多同时 5 个 await asyncio.gather(*[worker(i, sem) for i in range(20)]) asyncio.run(main())
-
- 超时与容错:网络世界充满不确定性。对于可能很慢或者不可靠的操作,一定要用
asyncio.wait_for设置超时,并妥善捕获异常。-
import asyncio async def job(): await asyncio.sleep(5) return “ok” async def main(): try: r = await asyncio.wait_for(job(), timeout=2) print(r) except asyncio.TimeoutError: print(“timeout”) asyncio.run(main())
-
- 任务生命周期:用
create_task创建任务后,务必记得通过await或者在gather中等待它完成。否则,主协程一旦提前退出,那些还没跑完的任务就会被无情取消。 - 何时使用异步 vs 线程/进程
- I/O 密集型(比如网络请求、磁盘读写、数据库操作):这是异步编程的主场,优先选择 asyncio。
- CPU 密集型(比如大量数学计算):异步在这里帮不上忙,反而可能因为事件循环被阻塞而变慢。这种情况下,应该优先考虑
multiprocessing或者concurrent.futures.ProcessPoolExecutor。当然,也可以在事件循环里用run_in_executor,把阻塞函数丢到线程池或进程池里去执行。
相关攻略
Ubuntu 系统 php-fpm conf 配置文件找不到?完整解决方案 在 Ubuntu 21 10 或更高版本中部署 Nginx + PHP FastCGI 环境时,如需配置 log_limit 等 PHP-FPM 专属参数,必须明确安装 php*-fpm 软件包。仅安装 PHP CGI 或
在 Ubuntu 系统中定位与查看 PHP 错误日志的完整指南 当 PHP 应用在 Ubuntu 服务器上出现异常时,错误日志是进行故障诊断的首要依据。准确找到并高效分析日志内容,能极大提升问题排查效率。本指南将详细介绍在 Ubuntu 系统中定位和查看 PHP 错误日志的多种方法。 第一步:启动终
Ubuntu 上安装 Python 的常见问题与对策 在 Ubuntu 上配置 Python 环境,看似简单,实则暗藏玄机。从版本选择、依赖安装到环境隔离,每一步都可能遇到意想不到的“坑”。别担心,这份指南将带你系统性地梳理常见问题,并提供经过验证的解决方案。 一、安装前准备与基础检查 动手之前,做
在Ubuntu上管理PHP-FPM服务 高效管理PHP-FPM服务是Linux服务器运维与Web开发环境配置中的核心技能。在Ubuntu系统中,您可以通过一系列简洁明了的命令行操作,轻松完成服务的启动、停止、重启与状态监控。本文将为您提供一份详尽的Ubuntu PHP-FPM服务管理指南。 1 启
在Ubuntu系统中定位与查看PHP-FPM错误日志的完整指南 当服务器出现PHP-FPM相关故障时,查看错误日志是诊断问题的首要且关键步骤。这些日志如同系统的“诊断报告”,详细记录了运行时发生的每一个异常、警告和错误信息。对于Ubuntu系统的用户而言,掌握快速定位并解读这些日志的方法,是高效运维
热门专题
热门推荐
iPhone 17:为何成为苹果史上最长寿的爆款? 最近科技圈有个消息传得挺热:iPhone 17标准版的生产周期被大幅拉长了。这可不是简单的产能调整,背后是苹果近期完成的大规模产能扩展。看来,这款热门机型已经瞄准了今年下半年的双11战场,准备再掀一波销售热潮。 消息一出,不少网友都在猜测原因。矛头
在快节奏的都市生活中,一款兼具便携性与环保特性的出行工具正成为越来越多人的选择 城市通勤的“最后一公里”难题,催生了对灵活出行方案的持续探索。近期,小米有品推出的mini智能电动平衡车,以其独特的设计理念和深度智能化功能,迅速吸引了市场的目光。它不仅仅是一款酷玩装备,更切实地为青少年和上班族提供了高
在数字化教育蓬勃发展的当下,家长们为孩子挑选学习设备时,既希望设备具备护眼功能,又期望能满足多样化的学习需求。传统平板电脑功能虽丰富,但长时间使用易引发视力疲劳;普通学习机功能又相对单一,难以契合现代教育的发展趋势。在此背景下,科大讯飞AI学习机系列凭借先进的护眼技术与智能学习系统,成为众多家长和学
目录 ethzilla是谁? ETHZilla独特其他ETH DAT之处 1、Peter Thiel持股ETHZilla近30% 2、Vitalik和以太坊基金会入局 3、聚焦DeFi和链上策略 结语 以太坊财库概念的热度,最近真是肉眼可见。伴随着这股热潮,ETH价格也强势突破了4700美元,距离历
全球彩电市场:存量博弈下的冰与火之歌 最近,行业调研机构奥维睿沃(A VC Revo)发布了一份引人关注的报告,揭示了2025年全球彩电市场的真实图景。数据显示,全球彩电整体出货量达到2 64亿台,同比仅微跌0 1%,市场基本盘看似稳固。 然而,拆开来看,内部结构正在发生深刻变化。LCD液晶电视依然





