Понимание сопрограмм Python async await (пример цикла блокировки) ⇐ Python
Понимание сопрограмм Python async await (пример цикла блокировки)
Я пытаюсь понять сопрограммы. Я знаю, что они используют одиночный поток, а ключевое слово await означает «вернуть управление другим работающим сопрограммам и дать им возможность запуститься».
У меня есть следующий пример:
импортировать asyncio время импорта асинхронная защита long_function(): # выполнение занимает почти 1 секунду для _ в диапазоне (50000000): проходить асинхронный счетчик определения(): для x в диапазоне (10): распечатать(х) #ожидайте asyncio.sleep(0) ждать long_function() асинхронное определение сбора(): ожидайте asyncio.gather(count(), count()) asyncio.run(собрать()) Я ожидаю, что этот код будет выполняться асинхронно и выдавать такой результат:
0 0 1 1 2 2 ... Однако это дает:
0 1 2 3 ... 0 1 2 3 ... Когда я раскомментирую asyncio.sleep(0), результат будет таким, как ожидалось — асинхронным.
Может ли кто-нибудь объяснить, почему использования await long_function() недостаточно для передачи управления другой сопрограмме? И как это работает на каком-то более низком уровне, чтобы помочь мне понять.
Спасибо.
Я пытаюсь понять сопрограммы. Я знаю, что они используют одиночный поток, а ключевое слово await означает «вернуть управление другим работающим сопрограммам и дать им возможность запуститься».
У меня есть следующий пример:
импортировать asyncio время импорта асинхронная защита long_function(): # выполнение занимает почти 1 секунду для _ в диапазоне (50000000): проходить асинхронный счетчик определения(): для x в диапазоне (10): распечатать(х) #ожидайте asyncio.sleep(0) ждать long_function() асинхронное определение сбора(): ожидайте asyncio.gather(count(), count()) asyncio.run(собрать()) Я ожидаю, что этот код будет выполняться асинхронно и выдавать такой результат:
0 0 1 1 2 2 ... Однако это дает:
0 1 2 3 ... 0 1 2 3 ... Когда я раскомментирую asyncio.sleep(0), результат будет таким, как ожидалось — асинхронным.
Может ли кто-нибудь объяснить, почему использования await long_function() недостаточно для передачи управления другой сопрограмме? И как это работает на каком-то более низком уровне, чтобы помочь мне понять.
Спасибо.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение