当前位置: 代码网 > it编程>前端脚本>Python > Python异步完全指南实例小结

Python异步完全指南实例小结

2026年01月14日 Python 我要评论
python中并行处理多个任务主要是靠:thread 线程process 进程asyncio 非同步process将一个py 脚本放入到内存中,程序就变成了 一个processprocess 是程序运

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异步完全指南内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com