我一直在尝试理解异步编程,特别是在Python中。我知道asyncio是建立在事件循环之上的,它调度协程的执行,但我读到了几种不同的定义协程的方法,我不明白它们之间的关系。
我阅读了this article以获取更多背景信息。虽然它涵盖了我提到的四种协程类型,但它并没有完全描述它们之间的区别。在没有任何外部模块的情况下,可以使用
我的问题是:
我阅读了this article以获取更多背景信息。虽然它涵盖了我提到的四种协程类型,但它并没有完全描述它们之间的区别。在没有任何外部模块的情况下,可以使用
yield
作为等号右侧的表达式来创建协程,然后通过.send()
输入数据。然而,使用@asyncio.coroutine
和@types.coroutine
装饰器的代码示例从未使用过.send()
。该文章中的代码示例如下:# Coroutine using yield as an expression
def coro():
hello = yield "Hello"
yield hello
c = coro()
print(next(c), end=" ")
print(c.send("World")) # Outputs Hello World
# Asyncio generator-based coroutine
@asyncio.coroutine
def display_date(num, loop):
end_time = loop.time() + 50.0
while True:
print("Loop: {} Time: {}".format(num, datetime.datetime.now()))
if (loop.time() + 1.0) >= end_time:
break
yield from asyncio.sleep(random.randint(0, 5))
# Types generator-based coroutine
@types.coroutine
def my_sleep_func():
yield from asyncio.sleep(random.randint(0, 5))
# Native coroutine in Python 3.5+
async def display_date(num, loop, ):
end_time = loop.time() + 50.0
while True:
print("Loop: {} Time: {}".format(num, datetime.datetime.now()))
if (loop.time() + 1.0) >= end_time:
break
await asyncio.sleep(random.randint(0, 5))
我的问题是:
yield
协程与types
或asyncio
装饰的协程有什么关系,以及何时使用.send()
功能?- 装饰器为未装饰的基于生成器的协程添加了哪些功能?
@asyncio.coroutine
和@types.coroutine
装饰器有何不同?我阅读了 this answer 以尝试理解这一点,但这里提到的唯一区别是如果没有 yield 语句,types
协程会像子例程一样执行。还有其他区别吗?- 这些基于生成器的协程在功能和实现上与最新的本机
async/await
协程有何不同?
@asyncio.coroutine
和@types.coroutine
之间有一个重要的区别,请参考:https://dev59.com/o1kS5IYBdhLWcg3wl32I#49477233 - Amir Kirsh