📜  异步、等待、python (1)

📅  最后修改于: 2023-12-03 15:39:30.389000             🧑  作者: Mango

异步编程和等待

在编写程序时,我们通常需要进行一些耗时的操作,如请求远程服务器,读写文件等。传统的同步编程模型会阻塞当前线程的执行,导致程序变得非常耗时。异步编程模型则可以在不阻塞线程的情况下执行耗时操作,从而提高程序的效率。

Python是一种非常好的异步编程语言。在Python中,我们可以使用协程来实现异步编程。使用协程可以让程序在执行长时间操作时不会阻塞主线程,从而提升程序的效率和响应速度。

Python标准库中提供了一个名为asyncio的模块,该模块提供了一些异步编程的工具和协程库。

async和await关键字

在Python 3.5之后的版本中,引入了async和await两个关键字,用于定义协程函数。async用于定义协程函数,而await用于等待协程函数执行完成。

以下是使用async和await定义一个协程函数的示例:

import asyncio

async def hello():
    await asyncio.sleep(1)
    print("Hello, world!")
    
asyncio.run(hello())

在上面的代码中,我们使用async定义一个协程函数hello。在该函数中,我们使用await等待异步操作asyncio.sleep(1)执行完成,然后输出一句话。

可以使用asyncio.run()方法来运行协程函数。

asyncio事件循环

在异步编程中,我们需要使用事件循环来驱动异步操作的执行。事件循环是一个无限循环的过程,它会从一个任务中切换到另一个任务,从而实现多任务的异步执行。

Python标准库中提供了一个asyncio的事件循环,我们可以使用该事件循环来驱动协程函数的执行。

以下是使用asyncio事件循环来驱动协程函数执行的示例:

import asyncio

async def hello():
    await asyncio.sleep(1)
    print("Hello, world!")
    
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

在上面的代码中,我们创建了一个事件循环loop,并使用run_until_complete()方法来启动协程函数hello的执行。运行完之后,我们需要调用loop.close()方法来关闭事件循环。

asyncio异步编程模型

在异步编程中,我们需要了解以下几个重要的概念:

  • 协程函数:使用async定义的函数,可以使用await关键字来等待异步操作执行完成。
  • 任务对象:将协程函数包装成一个任务对象,可以使用asyncio.create_task()方法来创建任务对象。
  • Future对象:异步操作执行的结果,可以使用await关键字等待Future对象的执行完成。

以下是一个使用协程函数、任务对象和Future对象的示例:

import asyncio

async def hello():
    await asyncio.sleep(1)
    return "Hello, world!"
    
async def main():
    task = asyncio.create_task(hello())
    result = await task
    print(result)
    
asyncio.run(main())

在上面的代码中,我们定义了一个协程函数hello,并使用asyncio.create_task()方法将其包装成一个任务对象。在main函数中,我们等待任务对象task执行完成,并使用await关键字获取异步操作的结果。最后输出结果。

参考资料

Python 语言参考手册:https://docs.python.org/zh-cn/3/reference/index.html

Python 异步 I/O:https://docs.python.org/zh-cn/3/library/asyncio.html

Python concurrency and parallelism:https://docs.python.org/zh-cn/3/library/concurrency.html