Я снова и снова читаю «Свободный Python» Лучано Рамальо, но не мог понять поведения asyncio.sleep внутри asyncio.
В одной части книги говорится:
Никогда не используйте time.sleep в сопрограммах asyncio, если вы не хотите блокировать основной поток, что приводит к замораживанию цикла событий и, возможно, всего приложения. (...) он должен выходить из asyncio.sleep (DELAY).
С другой стороны:
Каждая функция блокирующего ввода-вывода в стандартной библиотеке Python освобождает GIL (...). Функция time.sleep () также освобождает GIL.
Поскольку time.sleep () выпускает коды GIL в другом потоке, может выполняться, но блокирует текущий поток. Поскольку asyncio является однопоточным, я понимаю, что time.sleep блокирует цикл asyncio.
Но как asyncio.sleep () не блокирует поток? Можно ли не откладывать цикл событий и одновременно ждать?
asyncio.sleep()
на самом деле не спит. Он возвращает управление и планирует повторный вызов для продолжения. Он больше похож наyield
. - person Klaus D.   schedule 21.06.2020time.sleep
, который приостанавливает выполнение наx
секунды,asyncio.sleep
просто регистрирует будущее, которое будет вызываться черезx
секунды (а также передает управление обратно цикл обработки событий). - person cglacet   schedule 21.06.2020