@asyncio.coroutine 与 async def

python

1个回答

写回答

嗷嗷强

2025-06-24 21:25

+ 关注

Python
Python

在Python的异步编程中,有两种主要的方式来定义协程函数:使用装饰器@asyncio.coroutine和使用关键字async def。这两种方式都可以用于定义异步函数,但在语法上有一些差异。

使用装饰器@asyncio.coroutine来定义一个协程函数时,需要在函数定义前加上该装饰器。这个装饰器告诉解释器这是一个可等待的协程函数。协程函数内部可以使用yield from语句来挂起自身的执行,等待其他的协程或者Future完成。

而使用关键字async def来定义一个协程函数时,只需要在函数定义前加上async关键字即可。这种语法是Python 3.5引入的新特性,更加直观和简洁。在协程函数内部,可以使用awAIt语句来挂起自身的执行,等待其他的协程或者Future完成。

下面我们通过一个简单的案例来对比这两种方式的使用。

首先,我们定义一个使用装饰器@asyncio.coroutine的协程函数:

Python

import asyncio

@asyncio.coroutine

def coroutine_func():

print("Start coroutine")

yield from asyncio.sleep(1)

print("Coroutine completed")

然后,我们定义一个使用关键字async def的协程函数:

Python

import asyncio

async def async_func():

print("Start async function")

awAIt asyncio.sleep(1)

print("Async function completed")

接下来,我们可以使用asyncio库来调用这两个协程函数并观察它们的执行结果:

Python

import asyncio

loop = asyncio.get_event_loop()

loop.run_until_complete(coroutine_func())

loop.run_until_complete(async_func())

loop.close()

运行上述代码,我们可以看到输出结果如下:

Start coroutine

Coroutine completed

Start async function

Async function completed

可以看到,使用装饰器@asyncio.coroutine的协程函数在定义时需要加上装饰器,而使用关键字async def的协程函数则不需要。在内部使用挂起语句时,使用yield from和awAIt语句的方式也有所不同。

在Python的异步编程中,使用装饰器@asyncio.coroutine和使用关键字async def都可以用于定义协程函数。它们的语法有一些差异,但都能实现异步的效果。在实际开发中,可以根据个人喜好和项目需求选择合适的方式来定义协程函数。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号