首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
Ubuntu Python异步编程入门

Ubuntu Python异步编程入门

热心网友
48
转载
2026-05-05

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.sleeprequests.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,把阻塞函数丢到线程池或进程池里去执行。
来源:https://www.yisu.com/ask/18535118.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

如何解决 Ubuntu 系统中找不到 php-fpm.conf 的问题
编程语言
如何解决 Ubuntu 系统中找不到 php-fpm.conf 的问题

Ubuntu 系统 php-fpm conf 配置文件找不到?完整解决方案 在 Ubuntu 21 10 或更高版本中部署 Nginx + PHP FastCGI 环境时,如需配置 log_limit 等 PHP-FPM 专属参数,必须明确安装 php*-fpm 软件包。仅安装 PHP CGI 或

热心网友
05.06
PHP错误日志在Ubuntu中如何查看
编程语言
PHP错误日志在Ubuntu中如何查看

在 Ubuntu 系统中定位与查看 PHP 错误日志的完整指南 当 PHP 应用在 Ubuntu 服务器上出现异常时,错误日志是进行故障诊断的首要依据。准确找到并高效分析日志内容,能极大提升问题排查效率。本指南将详细介绍在 Ubuntu 系统中定位和查看 PHP 错误日志的多种方法。 第一步:启动终

热心网友
05.05
Ubuntu Python 安装过程中常见问题
编程语言
Ubuntu Python 安装过程中常见问题

Ubuntu 上安装 Python 的常见问题与对策 在 Ubuntu 上配置 Python 环境,看似简单,实则暗藏玄机。从版本选择、依赖安装到环境隔离,每一步都可能遇到意想不到的“坑”。别担心,这份指南将带你系统性地梳理常见问题,并提供经过验证的解决方案。 一、安装前准备与基础检查 动手之前,做

热心网友
05.05
php-fpm在ubuntu上如何启动停止
编程语言
php-fpm在ubuntu上如何启动停止

在Ubuntu上管理PHP-FPM服务 高效管理PHP-FPM服务是Linux服务器运维与Web开发环境配置中的核心技能。在Ubuntu系统中,您可以通过一系列简洁明了的命令行操作,轻松完成服务的启动、停止、重启与状态监控。本文将为您提供一份详尽的Ubuntu PHP-FPM服务管理指南。 1 启

热心网友
05.05
php-fpm错误日志ubuntu怎么查看
编程语言
php-fpm错误日志ubuntu怎么查看

在Ubuntu系统中定位与查看PHP-FPM错误日志的完整指南 当服务器出现PHP-FPM相关故障时,查看错误日志是诊断问题的首要且关键步骤。这些日志如同系统的“诊断报告”,详细记录了运行时发生的每一个异常、警告和错误信息。对于Ubuntu系统的用户而言,掌握快速定位并解读这些日志的方法,是高效运维

热心网友
05.05

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

史上最长寿标准版!iP17生产周期延长:苹果刀法变了
科技数码
史上最长寿标准版!iP17生产周期延长:苹果刀法变了

iPhone 17:为何成为苹果史上最长寿的爆款? 最近科技圈有个消息传得挺热:iPhone 17标准版的生产周期被大幅拉长了。这可不是简单的产能调整,背后是苹果近期完成的大规模产能扩展。看来,这款热门机型已经瞄准了今年下半年的双11战场,准备再掀一波销售热潮。 消息一出,不少网友都在猜测原因。矛头

热心网友
05.06
小米有品新款mini智能电动平衡车深度体验:便携智能,解锁城市出行新方式
科技数码
小米有品新款mini智能电动平衡车深度体验:便携智能,解锁城市出行新方式

在快节奏的都市生活中,一款兼具便携性与环保特性的出行工具正成为越来越多人的选择 城市通勤的“最后一公里”难题,催生了对灵活出行方案的持续探索。近期,小米有品推出的mini智能电动平衡车,以其独特的设计理念和深度智能化功能,迅速吸引了市场的目光。它不仅仅是一款酷玩装备,更切实地为青少年和上班族提供了高

热心网友
05.06
护眼与智能兼备:科大讯飞AI学习机深度评测,为孩子选对学习好帮手
科技数码
护眼与智能兼备:科大讯飞AI学习机深度评测,为孩子选对学习好帮手

在数字化教育蓬勃发展的当下,家长们为孩子挑选学习设备时,既希望设备具备护眼功能,又期望能满足多样化的学习需求。传统平板电脑功能虽丰富,但长时间使用易引发视力疲劳;普通学习机功能又相对单一,难以契合现代教育的发展趋势。在此背景下,科大讯飞AI学习机系列凭借先进的护眼技术与智能学习系统,成为众多家长和学

热心网友
05.06
以太坊(ETH)财库黑马ETHZilla解析:蒂尔和EF深度加持 mNAV高达6
web3.0
以太坊(ETH)财库黑马ETHZilla解析:蒂尔和EF深度加持 mNAV高达6

目录 ethzilla是谁? ETHZilla独特其他ETH DAT之处 1、Peter Thiel持股ETHZilla近30% 2、Vitalik和以太坊基金会入局 3、聚焦DeFi和链上策略 结语 以太坊财库概念的热度,最近真是肉眼可见。伴随着这股热潮,ETH价格也强势突破了4700美元,距离历

热心网友
05.06
国内彩电一年仅卖2763万台 创10年新低
科技数码
国内彩电一年仅卖2763万台 创10年新低

全球彩电市场:存量博弈下的冰与火之歌 最近,行业调研机构奥维睿沃(A VC Revo)发布了一份引人关注的报告,揭示了2025年全球彩电市场的真实图景。数据显示,全球彩电整体出货量达到2 64亿台,同比仅微跌0 1%,市场基本盘看似稳固。 然而,拆开来看,内部结构正在发生深刻变化。LCD液晶电视依然

热心网友
05.06