文档说:



_



看来目的是一样的-将生成器标记为协程(Python3.5及更高版本中的async def对某些功能有什么作用)。

当需要使用asyncio.coroutine的时候,有什么区别?

最佳答案

区别在于您是否具有yield语句。
这是代码:

from types import coroutine as t_coroutine
from asyncio import coroutine as a_coroutine, ensure_future, sleep, get_event_loop


@a_coroutine
def a_sleep():
    print("doing something in async")
    yield 1


@t_coroutine
def t_sleep():
    print("doing something in types")
    yield 1


async def start():
    sleep_a = a_sleep()
    sleep_t = t_sleep()
    print("Going down!")


loop = get_event_loop()
loop.run_until_complete(start())

在此示例中,所有内容看起来都一样-这是pycharm的调试信息(我们站在“往下走!”行)。控制台上还没有打印任何内容,因此功能尚未启动。

python - @ types.coroutine和@ asyncio.coroutine装饰器有什么区别?-LMLPHP

但是如果我们删除yield ,那么types版本将立即启动!
from types import coroutine as t_coroutine
from asyncio import coroutine as a_coroutine, ensure_future, sleep, get_event_loop


@a_coroutine
def a_sleep():
    print("doing something in async")


@t_coroutine
def t_sleep():
    print("doing something in types")


async def start():
    sleep_a = a_sleep()
    sleep_t = t_sleep()
    print("Going down!")


loop = get_event_loop()
loop.run_until_complete(start())

现在,我们在控制台中打印了doing something in types。这是调试信息:

python - @ types.coroutine和@ asyncio.coroutine装饰器有什么区别?-LMLPHP

如您所见,会在调用之后立即开始,如果没有结果,则返回None。

至于用法,应始终使用asyncio版本。如果您需要像火灾一样忘却运行(立即运行并稍后获得结果),请使用ensure_future函数。

关于python - @ types.coroutine和@ asyncio.coroutine装饰器有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39637675/

10-11 06:24