Python异步: 定义、创建和运行协程(5)

简介: 我们可以在我们的 Python 程序中定义协程,就像定义新的子例程(函数)一样。一旦定义,协程函数可用于创建协程对象。“asyncio”模块提供了在事件循环中运行协程对象的工具,事件循环是协程的运行时。

1. 如何定义协程

协程可以通过“async def”表达式定义。这是用于定义子例程的“def”表达式的扩展。它定义了一个可以创建的协程,并返回一个协程对象。

# define a coroutine
async def custom_coro():
    # ...

用“async def”表达式定义的协程被称为“协程函数”。

然后协程可以在其中使用特定于协程的表达式,例如 await、async for 和 async with。

# define a coroutine
async def custom_coro():
    # await another coroutine
    await asyncio.sleep(1)

2. 如何创建协程

一旦定义了协程,就可以创建它。这看起来像是在调用一个子程序。

...
# create a coroutine
coro = custom_coro()

这不会执行协程。它返回一个“协程”对象。“协程”Python 对象具有方法,例如 send() 和 close()。它是一种类型。

我们可以通过创建协程实例并调用 type() 内置函数来报告其类型来证明这一点。

# SuperFastPython.com
# check the type of a coroutine
 
# define a coroutine
async def custom_coro():
    # await another coroutine
    await asyncio.sleep(1)
 
# create the coroutine
coro = custom_coro()
# check the type of the coroutine
print(type(coro))

运行示例报告创建的协程是一个“协程”类。我们还会得到一个 RuntimeError,因为协程已创建但从未执行过,我们将在下一节中探讨它。

<class 'coroutine'>
sys:1: RuntimeWarning: coroutine 'custom_coro' was never awaited

协程对象是可等待的。这意味着它是一个实现了 __await__() 方法的 Python 类型。

3. 如何从 Python 运行协程

可以定义和创建协程,但它们只能在事件循环中执行。执行协程的事件循环,管理协程之间的协作多任务处理。

启动协程事件循环的典型方法是通过 asyncio.run() 函数。此函数接受一个协程并返回协程的值。提供的协程可以用作基于协程的程序的入口点。

# SuperFastPython.com
# example of running a coroutine
import asyncio
# define a coroutine
async def custom_coro():
    # await another coroutine
    await asyncio.sleep(1)
 
# main coroutine
async def main():
    # execute my custom coroutine
    await custom_coro()
 
# start the coroutine program
asyncio.run(main())

现在我们知道如何定义、创建和运行协程,让我们花点时间了解事件循环。

相关文章
|
3月前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
3月前
|
数据采集 存储 C++
Python异步爬虫(aiohttp)加速微信公众号图片下载
Python异步爬虫(aiohttp)加速微信公众号图片下载
|
2月前
|
Go 调度 Python
Golang协程和Python协程用法上的那些“不一样”
本文对比了 Python 和 Go 语言中协程的区别,重点分析了调度机制和执行方式的不同。Go 的协程(goroutine)由运行时自动调度,启动后立即执行;而 Python 协程需通过 await 显式调度,依赖事件循环。文中通过代码示例展示了两种协程的实际运行效果。
155 7
|
1月前
|
数据采集 网络协议 API
协程+连接池:高并发Python爬虫的底层优化逻辑
协程+连接池:高并发Python爬虫的底层优化逻辑
|
2月前
|
传感器 数据采集 监控
Python生成器与迭代器:从内存优化到协程调度的深度实践
简介:本文深入解析Python迭代器与生成器的原理及应用,涵盖内存优化技巧、底层协议实现、生成器通信机制及异步编程场景。通过实例讲解如何高效处理大文件、构建数据流水线,并对比不同迭代方式的性能特点,助你编写低内存、高效率的Python代码。
152 0
|
3月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
6月前
|
前端开发 JavaScript 关系型数据库
基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行
该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品。欢迎大家提出宝贵建议。
194 6
|
6月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的美容预约管理系统源码+运行
基于Python+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的美容诊所预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
103 9
|
6月前
|
JavaScript 前端开发 关系型数据库
基于Python+Vue开发的体育场馆预约管理系统源码+运行
本项目为大学生课程设计作业,采用Python和Vue技术构建了一个体育场馆预约管理系统(实现前后端分离)。系统的主要目标在于帮助学生理解和掌握Python编程知识,同时培养其项目规划和开发能力。参与该项目的学习过程,学生能够在实际操作中锻炼技能,为未来的职业发展奠定良好的基础。
152 3
|
6月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的房产销售管理系统源码+运行
基于Python+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的房产销售管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
108 2

推荐镜像

更多
下一篇
开通oss服务