16.python 协程和异步编程(asyncio)

Python的协程和异步编程库asyncio能有效处理I/O密集型任务,避免上下文切换开销。async和await关键字用于定义协程,例如示例中定义的hello()协程。asyncio提供事件循环和工具进行异步操作,如asyncio.sleep()和aiohttp库进行异步HTTP请求。
摘要由CSDN通过智能技术生成

Python 中的协程和异步编程可以让我们更加高效地处理 I/O 密集型任务,避免了多线程和多进程中的上下文切换开销。在本回答中,我们将重点介绍 Python 的协程和异步编程库 asyncio。

协程

协程是一种轻量级的线程,它可以在单线程内实现并发执行。Python 支持通过 asyncawait 关键字来定义协程。以下是一个简单的协程示例:

import asyncio

# 定义协程函数
async def hello():
    print('Hello')
    await asyncio.sleep(1)
    print('World')

# 创建事件循环并运行协程
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())

在上面的示例中,我们定义了一个协程函数 hello(),它先打印出“Hello”,然后等待 1 秒钟并打印出“World”。在主程序中,我们创建了一个事件循环并使用 run_until_complete() 方法来运行这个协程。

异步编程(asyncio)

Python 提供了一个内置的异步编程库 asyncio,它可以帮助我们更加方便地使用协程和事件循环进行异步编程。以下是一个简单的 asyncio 示例:

import asyncio

# 定义协程函数
async def hello():
    print('Hello')
    await asyncio.sleep(1)
    print('World')

# 创建事件循环并运行协程
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())

在上面的示例中,我们使用 asyncio.sleep() 函数来模拟一个耗时的 I/O 操作,并通过事件循环来执行协程。需要注意的是,在异步编程中,应该尽量避免使用阻塞式操作,否则会影响事件循环的效率。

除了协程和事件循环,asyncio 还提供了许多工具和库,如异步网络库、异步数据库驱动程序等,可以方便地进行各种异步 I/O 操作。例如,我们可以使用 aiohttp 库来实现异步 HTTP 请求:

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://www.example.com')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在上面的示例中,我们使用 aiohttp 库来发送异步 HTTP 请求,使用 aiohttp.ClientSession() 来创建一个异步的 HTTP 客户端会话,并使用 fetch() 协程函数来发送请求并返回响应内容。在主程序中,我们通过事件循环运行 main() 协程函数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值