Функция asyncio.sleep
просто регистрирует будущее для вызова через x
секунд , а time.sleep
приостанавливает выполнение на x
секунд .
Вы можете проверить, как оба ведут себя на этом небольшом примере, и увидеть, как asyncio.sleep(1)
на самом деле не дает вам подсказки о том, как долго он будет «спать», потому что это не то, что он на самом деле делает:
import asyncio
import time
from datetime import datetime
async def sleep_demo():
print("sleep_demo start: ", datetime.now().time())
await asyncio.sleep(1)
print("sleep_demo end: ", datetime.now().time())
async def I_block_everyone():
print("I_block_everyone start: ", datetime.now().time())
time.sleep(3)
print("I_block_everyone end: ", datetime.now().time())
asyncio.gather(*[sleep_demo(), I_block_everyone()])
Это напечатает:
sleep_demo start: 04:46:55.902913
I_block_everyone start: 04:46:55.903119
I_block_everyone end: 04:46:58.905383
sleep_demo end: 04:46:58.906038
Блокирующий вызов time.sleep
не позволяет событию l oop планировать будущее, которое возобновляется sleep_demo
. В конце концов, управление возвращается только примерно через 3 секунды.
Теперь, что касается «Функция time.sleep()
также освобождает GIL.», Это не противоречие, так как это разрешает выполнение только другому потоку ( но текущий поток будет оставаться в ожидании x
секунд). В некоторой степени оба выглядят немного похожими: в одном случае GIL освобождается, чтобы освободить место для другого потока, в asyncio.sleep
событие l oop снова получает управление, чтобы запланировать другую задачу.