当前位置:

首页 > 编程开发 > Ubuntu Python异步编程入门

Ubuntu Python异步编程入门

Ubuntu 下 Python 异步编程入门指南 一 环境准备 想在 Ubuntu 上玩转异步编程,首先得把环境搭好。这里有几个关键步骤: Python 版本选择:强烈建议使用 Python 3.7 或更高版本。如果你的系统版本比较旧,可以通过添加 deadsnakes PPA 源来安装新版本。别忘

Ubuntu 下 Python 异步编程入门指南

Ubuntu Python异步编程入门

一 环境准备

想在 Ubuntu 上玩转异步编程,首先得把环境搭好。这里有几个关键步骤:

  • Python 版本选择:强烈建议使用 Python 3.7 或更高版本。如果你的系统版本比较旧,可以通过添加 deadsnakes PPA 源来安装新版本。别忘了创建虚拟环境,它能帮你把项目依赖隔离得干干净净。
    • 安装与准备
      • sudo apt update && sudo apt install -y python3 python3-pip
      • sudo add-apt-repository ppa:deadsnakes/ppa
      • sudo apt install -y python3.10 python3.10-venv
    • 创建虚拟环境
      • python3.10 -m venv .venv
      • source .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())
  • 运行方式
    • 记住这个标准流程:用 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,把阻塞函数丢到线程池或进程池里去执行。
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Ubuntu
相关文章 更多
Ubuntu命令行入门:打开终端并验证文件目录操作
Ubuntu命令行入门:打开终端并验证文件目录操作

本教程指导Ubuntu新手打开终端,通过pwd、ls、cd、mkdir和touch命令完成基础文件目录操作。适用于桌面版、虚拟机及WSL环境,提供从查看路径到创建测试文件的完整验证步骤,帮助读者建立命令行操作的安全意识与正确习惯。

在VMware中安装Ubuntu并验证启动的完整步骤
在VMware中安装Ubuntu并验证启动的完整步骤

本文提供在VMware中安装Ubuntu并验证启动的完整流程。适用于首次练习Linux或搭建开发环境的用户。按步骤完成虚拟机创建、ISO挂载、硬件分配与安装后,可通过终端命令确认版本、内核与网络状态,确保系统可正常使用。

Ubuntu 26.04 将显著提升英伟达图形显卡在 Wayland 环境下的性能
Ubuntu 26.04 将显著提升英伟达图形显卡在 Wayland 环境下的性能

Ubuntu26.04LTS针对英伟达显卡在Wayland+GNOME环境进行性能调优,通过修改gbm_surface_lock_front_buffer函数,将帧渲染等待时间从毫秒级降至微秒级,显著提升UI响应和画面流畅度。该补丁已作为发行版专属补丁集成,确保LTS用户无需等待上游整合即可获得优化体验。

Ubuntu Touch 24.04-2.0 Beta 发布:适配索尼 Xperia X 等手机 提升上网体验
Ubuntu Touch 24.04-2.0 Beta 发布:适配索尼 Xperia X 等手机 提升上网体验

UbuntuTouch24.04-2.0Beta发布,底层升级至Ubuntu24.04,浏览器引擎从Chromium87跃升至134,网页兼容性显著提升;新增屏幕刘海区域自动适配、截图编辑器、网络指示器改进、移动数据可靠性增强、数据加密稳定,并新增NothingPhone(1)等设备支持。

Ubuntu如何查看系统防火墙规则
Ubuntu如何查看系统防火墙规则

ufw status仅显示高层策略和显式添加的规则(如“80 ALLOW Anywhere”),不反映默认策略绕过、IPv6独立规则、Docker等直写nftables的bypass规则,也无法体现本地回环流量不受管控等底层细节。Ubuntu 默认用 ufw 管理防火墙,但规则实际由 nftable

Ubuntu如何更换锁屏背景图片
Ubuntu如何更换锁屏背景图片

锁屏背景和桌面壁纸之所以不同,是因为GNOME默认会复制桌面壁纸,然后强制叠加高斯模糊和亮度调整效果,这个效果是由lockDialogGroup的CSS来控制的。要是想去除模糊,建议使用Control Blur Effect On Lock Screen扩展,把Adjust Sigma设置为0就行。

UbuntuSwapper在服务器上应用效果如何
UbuntuSwapper在服务器上应用效果如何

Ubuntu Swapper(一般就是指Ubuntu的交换分区或者交换文件)在服务器上的应用成效,是由多个因素共同决定的,像服务器的硬件配置情况、工作负载的类型以及交换空间的大小和具体配置等。下面为大家带来一些有关Ubuntu Swapper在服务器上应用效果的一般性评价:正面效果内存管理:交换空间

Ubuntu如何配置命令行模式下的中文支持
Ubuntu如何配置命令行模式下的中文支持

根本原因是纯命令行tty默认不支持UTF-8及中文字体渲染,locale设置仅影响字符解析逻辑,不解决字体绘制问题;图形终端自带UTF-8渲染,而tty需借助fbterm等工具实现中文显示。为什么终端里中文显示为问号或方块 纯命令行(tty,例如通过Ctrl+Alt+F3进入的界面)默认不会加载UT

如何通过Tomcat日志提升Ubuntu服务器性能
如何通过Tomcat日志提升Ubuntu服务器性能

通过分析Tomcat日志来提升Ubuntu服务器性能是一个很好的方法。以下是一些步骤和建议,帮助你通过Tomcat日志来优化服务器性能:1. 收集日志首先,得保证你的Tomcat服务器有详细的日志记录配置。在conf/logging.properties文件里,你可以对日志级别和输出格式进行调整。o

Ubuntu如何设置具体的命令行配色
Ubuntu如何设置具体的命令行配色

直接修改PS1是最为可控且轻量的方法。因为GNOME Terminal主题难以区分提示符、命令输入与输出,而PS1搭配ANSI转义码能够精准地为各个字段上色,并且需要用[ ]进行包裹,以防止光标出现错位的情况。直接改 PS1 是最可控、最轻量的方式,不需要装框架或改终端全局配色。 为什么不用改 GN

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
AirBuddy 3 macOS版
AirBuddy 3 macOS版
macOS

AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

AirServer macOS版
AirServer macOS版
macOS

AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

AnyDesk macOS版
AnyDesk macOS版
macOS

AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

WINDOWS 更多
AnyDesk Windows版
AnyDesk Windows版
Windows

AnyDesk Windows版是一款轻量化远程桌面与技术支持工具,可用于控制异地电脑、传输文件、远程打印及无人值守访问。它兼顾连接响应、安全权限和部署灵活性,适合个人远程办公、企业设备维护与客服支持。

Boom 3D Windows版
Boom 3D Windows版
Windows

Boom 3D Windows版是一款面向音乐、电影和游戏场景的系统级音效增强工具,支持虚拟3D环绕声、31段均衡器、预设音效、应用音量控制及本地音乐播放,可配合耳机、扬声器和蓝牙耳机使用。

Boris FX Windows版
Boris FX Windows版
Windows

Boris FX Windows版是一套服务于影视剪辑、视觉特效、运动跟踪、转描、图像修饰及音频修复的专业创作工具集合,可作为插件接入多种主流后期宿主,也包含可独立运行的应用,适合剪辑师、特效师与内容创作者使用。