Python异步完全指南实例小结

 更新时间:2026年01月14日 08:51:08   作者:MyKai + 关注  
本文主要介绍了Python中并行处理多个任务的几种方式,包括多进程、多线程和异步编程,多进程适用于CPU密集型任务,多线程适用于I/O密集型任务,异步编程通过单线程和协程实现高效并发,感兴趣的朋友跟随小编一起看看吧

Python中并行处理多个任务主要是靠:

  • thread 线程
  • process 进程
  • asyncio 非同步

process

将一个py 脚本放入到内存中,程序就变成了 一个process

process 是程序运行的实例,process 有自己的内存,通信;不同的process之间彼此独立

process 通常分为二种

  • I/O密集型,cpu使用率较低,大量时间在等待网络,用户输入输出
  • CPU 密集型,cpu使用率较高,在大量计算,数据分析,视频编码等

Thread 线程

线程是Process的最小单位,每个Process 至少有一个线程(主线程);线程在同一个process内共享资源,一个线程操作不当,会导致整个process 崩溃。

CPU 执行process / thread的机制

CPU 一次只能执行一个任务,为了处理多个任务,抢占式切换任务。

抢占式切换:process保留当前状态,开辟新的内存空间,增加消耗,在同一个process里,thread 共享空间,所以开销更小。

对于多核CPU ,每个核心都能处理不同的进程。节省了大量的切换开销。

PYTHON GIL锁机制

在同一个process内,GIL是一种锁,允许任何时候只有一个线程控制 Python 解释器。在I/O 等待场景,会释放GIT锁。

GIL 的存在是为了解决竞态问题,防止多个线程彼此大家。

asyncio 异步

asyncio 使用单一线程来处理多个任务,避免了大量上下文切换带来的开销

  • Coroutines 把普通函数定义为协程函数 代表该函数可以暂停/恢复
  • Event loop 事件循环,负责管理执行Coroutines
  • Tasks 协程具体的对象 通过asyncio.create_task()调度
  • await 暂停协程的执行

协程创建之后,不会自动调用。asyncio.run()来运行

适合 需要大量等待的小任务场景

asyncio.create_task()

让函数立即进入队列(不是立即执行,等待其他函数交出控制权)create_task() 解除等待关系,把协程交给事件循环管理;只要存在 await 的让出点,多个任务就可以交叉推进

await a()
await b()
# 交叉
ta = create_task(a())
tb = create_task(b())
await ta
await tb

asyncio.to_thread

asyncio.to_thread 让同步阻塞代码在另一个线程运行,从而保证事件循环线程不被阻塞。

async def main():
    print("start")
    asyncio.create_task(
        asyncio.to_thread(fetch_data)
    )
    print("end")
写法函数何时执行当前协程是否继续
await to_thread()立即(在线程)否(等结果)
create_task(to_thread())立即(在线程)

检测判断

你在 async 函数里,要调用一个函数 F

├─ F 是 async 协程函数?
│ │
│ ├─ 是
│ │ │
│ │ ├─ 需要等 F 的结果?
│ │ │ ├─ 是 → await F()
│ │ │ └─ 否 → create_task(F())
│ │ │
│ │ └─(结束)
│ │
│ └─ 否(F 是同步阻塞函数)
│ │
│ ├─ 需要等 F 的结果?
│ │ ├─ 是 → await asyncio.to_thread(F)
│ │ └─ 否 → create_task(asyncio.to_thread(F))
│ │
│ └─(结束)

到此这篇关于Python异步完全指南的文章就介绍到这了,更多相关Python异步完全指南内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python+matplotlib实现堆叠图的绘制

    Python+matplotlib实现堆叠图的绘制

    Matplotlib作为Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。本文将利用Matplotlib库绘制堆叠图,感兴趣的可以了解一下
    2022-03-03
  • 利用Python实现简单的相似图片搜索的教程

    利用Python实现简单的相似图片搜索的教程

    这篇文章主要介绍了利用Python实现简单的相似图片搜索的教程,文中的示例主要在一个图片指纹数据库中实现,需要的朋友可以参考下
    2015-04-04
  • Python中文件路径的处理方式总结

    Python中文件路径的处理方式总结

    本文详细介绍了Python的os和pathlib模块在文件路径处理中的应用,包括常用函数和类方法,以及它们之间的对比和实例演示,旨在帮助开发者提升文件操作效率和代码可读性,需要的朋友可以参考下
    2025-03-03
  • Python读取Pickle文件信息并计算与当前时间间隔的方法分析

    Python读取Pickle文件信息并计算与当前时间间隔的方法分析

    这篇文章主要介绍了Python读取Pickle文件信息并计算与当前时间间隔的方法,涉及Python基于pickle模块操作文件属性相关实现技巧,需要的朋友可以参考下
    2019-01-01
  • python使用Plotly绘图工具绘制气泡图

    python使用Plotly绘图工具绘制气泡图

    这篇文章主要为大家详细介绍了python使用Plotly绘图工具绘制气泡图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • python 爬取壁纸网站的示例

    python 爬取壁纸网站的示例

    这篇文章主要介绍了python 爬取壁纸网站的示例,帮助大家更好的理解和学习使用python爬虫,感兴趣的朋友可以了解下
    2021-03-03
  • 基于KL散度、JS散度以及交叉熵的对比

    基于KL散度、JS散度以及交叉熵的对比

    这篇文章主要介绍了基于KL散度、JS散度以及交叉熵的对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python动态网页批量爬取

    python动态网页批量爬取

    这篇文章主要介绍了python动态网页批量爬取的方法,主要针对四六级成绩批量爬取,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 基于Django实现日志记录报错信息

    基于Django实现日志记录报错信息

    这篇文章主要介绍了基于Django实现日志记录报错信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Pandas如何对Categorical类型字段数据统计实战案例

    Pandas如何对Categorical类型字段数据统计实战案例

    这篇文章主要介绍了Pandas如何对Categorical类型字段数据统计实战案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论