在深入研究python源代码后,我找到了根本原因:
-
在蟒蛇3。6,尽管
async/await
已经在那里了,,
coroutine.sleep
generator based coroutine
@coroutine
def sleep(delay, result=None, *, loop=None):
"""Coroutine that completes after a given time (in seconds)."""
if delay == 0:
yield
return result
if loop is None:
loop = events.get_event_loop()
future = loop.create_future()
h = future._loop.call_later(delay,
futures._set_result_unless_cancelled,
future, result)
try:
return (yield from future)
finally:
h.cancel()
-
协同程序。睡觉
开始切换到
native coroutine
async def sleep(delay, result=None, *, loop=None):
"""Coroutine that completes after a given time (in seconds)."""
if delay <= 0:
await __sleep0()
return result
if loop is None:
loop = events.get_event_loop()
future = loop.create_future()
h = loop.call_later(delay,
futures._set_result_unless_cancelled,
future, result)
try:
return await future
finally:
h.cancel()
所以,当蟒蛇3。6执行
yield from asyncio.sleep(1)
事实上,它并没有从本地协同程序中产生,当然也没有错误。