Python协同程序不';t与时间同时运行。sleep()?

Python协同程序不';t与时间同时运行。sleep()?,python,async-await,coroutine,python-asyncio,Python,Async Await,Coroutine,Python Asyncio,我试着去学习下面的例子;下面是同时运行两个say\u aftercorroutines的代码片段: import asyncio import time async def say_after(delay, what): await asyncio.sleep(delay) # time.sleep(delay) print(what) async def main(): task1 = asyncio.create_task(say_after(1, '

我试着去学习下面的例子;下面是同时运行两个
say\u after
corroutines的代码片段:

import asyncio
import time


async def say_after(delay, what):
    await asyncio.sleep(delay)
    # time.sleep(delay)
    print(what)


async def main():
    task1 = asyncio.create_task(say_after(1, 'hello'))
    task2 = asyncio.create_task(say_after(2, 'world'))


    print(f"Started at {time.strftime('%X')}")

    await task1
    await task2

    print(f"Finished at {time.strftime('%X')}")


if __name__ == "__main__":
    asyncio.run(main())
如果我运行这个,我会发现开始和结束相隔两秒:

Started at 12:59:35
hello
world
Finished at 12:59:37
但是,如果我将
wait asyncio.sleep(delay)
替换为
time.sleep(delay)
(上面代码段中注释掉的行),我会发现它们相隔3秒,因此基本上是同步运行的:

Started at 13:00:53
hello
world
Finished at 13:00:56
我不太明白这一点;即使任务本身包含同步代码,让并发任务并行运行不是很重要吗?为什么这个例子不再使用
time.sleep()
而不是
asyncio.sleep()

我不太明白这一点;即使任务本身包含同步代码,让并发任务并行运行不是很重要吗

并发!=相似在编写
asyncio
代码时,底层例程仍然必须返回到eventloop以允许并发。不管怎样,吉尔仍然在那里

为什么这个例子不再使用time.sleep()而不是asyncio.sleep()

asyncio.sleep
挂起当前任务,允许其他任务运行<代码>时间。睡眠没有,它是一个阻塞调用(“阻塞”意味着它阻塞主线程中的执行,而使用asyncio的程序仍然是单线程的)

协同路由提供协作并发性,而不是并行性


为了通过协同路由实现良好的并发性,在
asyncio.run
中调用的任何代码都必须以非阻塞方式编写。实际上,这意味着任务中运行的任何代码都有责任在暂停执行的最佳时机发出信号,例如,“我没有做任何有用的事情,因为我在等待I/O…”-这允许另一个任务使用事件循环。

如果
time.sleep(),为什么你认为
asyncio.sleep()
会存在
是否在异步上下文中实际工作
time.sleep()
阻塞整个线程。需要非阻塞调用,time.sleep阻塞线程。
time.sleep
阻塞一个需要明确的要点:
asyncio
是协作并发;如果您没有做一些事情来显式地将控制权交还给事件循环(例如使用
wait
),那么在代码完成之前,事件循环将没有机会运行任何其他操作。如果您选择阻止非异步等待的事情,事件循环无法知道它可以做其他事情,因此它只会一直等待您将控制权交还给它。与一些多任务实现进行比较和对比,在这些多任务实现中,新任务可以在完成之前中断(“上下文切换”)正在运行的任务,不要等待它们结束。顺便说一句,这里还解释了
asyncio.sleep()
time.sleep()
之间的区别:。