文档说:
_
看来目的是一样的-将生成器标记为协程(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的调试信息(我们站在“往下走!”行)。控制台上还没有打印任何内容,因此功能尚未启动。
但是如果我们删除
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
。这是调试信息:如您所见,会在调用之后立即开始,如果没有结果,则返回None。
至于用法,应始终使用
asyncio
版本。如果您需要像火灾一样忘却运行(立即运行并稍后获得结果),请使用ensure_future
函数。关于python - @ types.coroutine和@ asyncio.coroutine装饰器有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39637675/