关于python:Python的异步IOasyncio使用

38次阅读

共计 2001 个字符,预计需要花费 6 分钟才能阅读完成。

Python 的 asyncio 模块是一个用于编写单线程并发代码的库,应用协程,多路复用 IO 以及其余技术。在本文中,咱们将介绍 asyncio 的基本概念和应用办法。

一、异步编程和协程

异步编程是一种编程范式,它容许程序在期待某个操作实现时继续执行其余工作。这对于 IO 密集型工作十分有用,例如网络申请或文件操作,这些操作通常须要期待一段时间。
在 Python 中,咱们能够应用协程(coroutines)来编写异步代码。协程是能够在任何时候暂停和复原的函数。Python 的协程通过 async/await 语法来定义和应用。
以下是一个简略的协程的例子:


import asyncio

async def main():
    print('Hello')
    await asyncio.sleep(1)
    print('World')

asyncio.run(main())

在这个例子中,main 是一个协程,咱们用 async 关键字来定义它。main 协程首先打印 ’Hello’,而后期待 1 秒,而后打印 ’World’。咱们用 await 关键字来期待一个异步操作(在这个例子中是 asyncio.sleep(1))的实现。asyncio.run 函数用于运行一个协程。

二、工作和事件循环

在 asyncio 中,协程不会立刻执行。相同,咱们须要将协程注册到事件循环(event loop),而后由事件循环来调度协程的执行。事件循环是 asyncio 的外围,它负责调度和执行工作。
工作(Task)是对协程的封装。当咱们将一个协程注册到事件循环时,它会被包装成一个工作。
以下是一个创立和运行工作的例子:

import asyncio

async def hello():
    await asyncio.sleep(1)
    print('Hello, World!')

async def main():
    task = asyncio.create_task(hello())
    await task

asyncio.run(main())

在这个例子中,咱们应用 asyncio.create_task 函数将 hello 协程包装成一个工作,并将其注册到事件循环。而后咱们期待工作的实现。

三、异步 IO

asyncio 反对异步的 IO 操作,包含网络申请和文件操作。
以下是一个应用 asyncio 进行异步网络申请的例子:

import asyncio
import aiohttp

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, 'http://python.org')
        print(html)

asyncio.run(main())

在这个例子中,咱们应用 aiohttp 库进行异步的 HTTP 申请。aiohttp 是一个基于 asyncio 的异步 HTTP 申请

四、异步上下文管理器和异步迭代器

asyncio 还反对异步上下文管理器和异步迭代器。这容许咱们在异步代码中应用 with 语句和 for 语句。
异步上下文管理器是实现了异步__aenter__和__aexit__办法的对象。咱们能够在 async with 语句中应用异步上下文管理器。
异步迭代器是实现了__aiter__和__anext__办法的对象。咱们能够在 async for 语句中应用异步迭代器。
以下是一个应用异步上下文管理器和异步迭代器的例子:


import asyncio

class AsyncIterable:
    def __init__(self, iterable):
        self.iterable = iterable

    def __aiter__(self):
        return self

    async def __anext__(self):
        if not self.iterable:
            raise StopAsyncIteration
        return self.iterable.pop(0)

async def main():
    async for i in AsyncIterable([1, 2, 3, 4, 5]):
        await asyncio.sleep(1)
        print(i)

asyncio.run(main())

在这个例子中,AsyncIterable 是一个异步迭代器,它每次产生一个元素,并在产生每个元素后期待 1 秒。

五、论断

Python 的 asyncio 模块为咱们提供了一种优雅的形式来编写异步代码。通过应用协程,咱们能够编写出看起来像同步代码,但实际上是异步的代码。这使得咱们的代码更容易了解和保护。尽管 asyncio 的学习曲线可能比拟平缓,但一旦把握了它,你会发现它是一个十分弱小的工具。

六、最初

如果感觉本文对你有帮忙记得 点个关注,给个赞,加个珍藏, 更多精彩内容欢送查看。

正文完
 0