Python协程从入门到精通:解锁高效并发编程的秘籍!

liftword5个月前 (02-07)技术文章47

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。

前期基础教程:

「Python3.11.0」手把手教你安装最新版Python运行环境

讲讲Python环境使用Pip命令快速下载各类库的方法

Python启航:30天编程速成之旅(第2天)-IDE安装

【Python教程】JupyterLab 开发环境安装


在当今的编程世界中,Python 协程已经成为提升程序性能和效率的关键技术之一。无论是处理 I/O 密集型任务,还是构建高性能的异步应用,协程都扮演着不可或缺的角色。今天,就让我们一起深入探索 Python 协程的奥秘,从基础概念到高级应用,一步步揭开它的神秘面纱。

一、什么是协程?

协程是一种轻量级的并发单元,它比传统的线程更加高效,开销更小。与线程依赖操作系统的抢占式调度不同,协程通过显式地让出控制权(await)来实现并发。这种协作式调度方式使得协程在单线程内就能完成高效的并发任务,特别适合处理 I/O 密集型任务。

协程 vs 线程

特性

线程

协程

调度方式

抢占式调度

协作式调度

开销

需要操作系统线程资源

轻量级,无需 OS 参与

执行方式

并行

并发

适用场景

CPU 密集型任务

I/O 密集型任务

二、Python 协程的基础

Python 中的协程主要依赖于 asyncio 模块。从 Python 3.5 开始,引入了 async 和 await 关键字,使得协程的使用更加方便。

1. 定义协程

协程是通过 async def 定义的函数。例如:

async def say_hello():
    print("Hello,")
    await asyncio.sleep(1)
    print("World!")

在这个例子中,await asyncio.sleep(1) 模拟了一个异步操作,协程在此处暂停执行,释放控制权。

2. 运行协程

要运行协程,需要使用 asyncio.run()。

import asyncio

async def say_hello():
    print("Hello,")
    print("等待一秒。")
    await asyncio.sleep(1)
    print("World!")

asyncio.run(say_hello())

输出结果为:

3. 并发执行多个协程

可以使用 asyncio.gather() 来并发运行多个协程。例如:

import asyncio

async def task(name, delay):
    print(f"Task {name} started")
    await asyncio.sleep(delay)
    print(f"Task {name} completed")

async def main():
    await asyncio.gather(
        task("A", 2),
        task("B", 1),
        task("C", 3)
    )

asyncio.run(main())

在这个例子中,多个任务并发执行,大大节省了时间。

三、高级应用:任务管理与并发控制

1. 创建任务

使用 asyncio.create_task() 可以将协程封装成任务并立即调度:

import asyncio

async def task(name):
    print(f"Task {name} started")
    await asyncio.sleep(1)
    print(f"Task {name} completed")

async def main():
    task1 = asyncio.create_task(task("A"))
    task2 = asyncio.create_task(task("B"))
    await task1
    await task2

asyncio.run(main())

这种方式允许我们在需要时调度多个任务,并在合适的位置等待结果。

2. 限制并发数

在某些场景中,需要限制并发数以避免资源耗尽。可以使用 asyncio.Semaphore 来控制:

semaphore = asyncio.Semaphore(2)

async def limited_task(name, delay):
    async with semaphore:
        print(f"Task {name} started")
        await asyncio.sleep(delay)
        print(f"Task {name} completed")

async def main():
    await asyncio.gather(
        limited_task("A", 2),
        limited_task("B", 1),
        limited_task("C", 3),
        limited_task("D", 1)
    )

asyncio.run(main())

在这个例子中,asyncio.Semaphore(2) 设置同时最多只能有两个任务在执行。

四、总结

Python 协程是一种强大的并发编程工具,尤其适合处理 I/O 密集型任务。通过合理使用 asyncio 模块和相关工具,我们可以轻松实现高效的异步编程。无论是简单的异步任务,还是复杂的数据库操作,协程都能帮助我们提升程序的性能和效率。

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。

相关文章

【2022·合辑】Python量化从入门到精通

引言春去秋来,公众号“Python金融量化”已坚持了四个年头,全网关注量10万+。在公众号阅读量急剧下降,短视频盛行的当下仍坚持文字输出着实不容易。这一路走来非常感谢广大读者的支持,尤其是感谢知识星球...

神仙级python入门教程(非常详细),从零基础入门到精通,建议收藏

同时我也为大家整理好了python入门的学习基本语法,可以帮大家省下不少时间。如果你想要入门python,给大家准备了一份:282G全网最全的python资料包免费领取!都已经整理成学习文档,需要的小...

零基础自学Python编程从入门到精通基础教程《从零开始学Python》

推荐理由本书面向零基础读者,巧用类比式描述,技术知识点轻松掌握; 基于案例进行讲解,读者可轻松理解编程思维,并在配套代码中参透Python编程的技巧。 本书囊括5项常见任务,助力快速掌握Python。...

Python从零基础入门到精通:一个月就够了

如果想从零基础到入门,能够全职学习(自学),那么一个月足够了。非全职(自学)的话这个时间就可能更长,3-6个月。如果想更精通,时间就不限了,整体学习路线及不同时间段需要掌握的知识列在这里:如果想快速实...

Python从入门到精通:老程序员速成记

.1 深入接触Python:功能特性和优势-作为有多年软件开发经验的老程序员,即使没有机会使用Python做软件项目,也多少会接触一点,形象的比喻:即使没吃过猪肉,也应该见过猪跑。而事实上,Pytho...

【Python王者归来】手把手教你,Python从入门到精通!

用800个程序实例、5万行代码手把手教你,Python从入门到精通!...