Сопрограммы — это неизбежная основа Python, благодаря наличию сопрограмм Python значительно повысил эффективность выполнения. Кооперативное слово сопрограммы имеет значение сотрудничества. Предположим, мы хотим запустить несколько функций в случае только одного потока. Обычный процесс должен запускаться одна за другой, но такая эффективность слишком низкая. Очень простой пример, если есть три функции, первая функция работает 3 минуты, вторая функция работает 2 минуты, а третья функция работает 1 минуту, то для запуска требуется 6 минут, но для использования сопрограммы требуется всего 3 минуты. , потому что максимальное значение допустимо, и его не нужно суммировать. Если функция здесь не процессороемкая, а требует лишь небольшого количества вычислительных ресурсов, но требует много времени.Например, такой пример очень распространен, такие как сетевые запросы.На самом деле сетевые запросы не требуются для вычислительных ресурсов на компьютере.Не много, но много времени ожидания, поэтому, если мы можем сотрудничать во время перерывов в процессе ожидания, мы можем использовать этот поток для вычисления других функций. Мы можем рассмотреть очень простой пример:
import time
import asyncio
async def eat():
await asyncio.sleep(3)
print('吃饭')
async def sleep():
await asyncio.sleep(2)
print('睡觉')
async def dadoudou():
await asyncio.sleep(1)
print('打豆豆')
loop=asyncio.get_event_loop()
tasks=asyncio.gather(eat(),sleep(),dadoudou())
start=time.time()
loop.run_until_complete(tasks)
print('total spend time is {:.2f}s'.format(time.time()-start))
loop.close()
Результат запуска следующий:
打豆豆
睡觉
吃饭
total spend time is 3.00s
Мы можем обнаружить, что наша программа завершается всего через 3 секунды, а не через 6. В этом прелесть сопрограмм. Как это работает?
В приведенной выше программе мы используем функциюasyncio.gather(eat(),sleep(),dadoudou())
Заканчиваем, эта функция не просто обертка, но, к счастью, она запланирована во внутренней задаче процесса, и при планировании было найдено триawiat
ключевое слово, он может знать, что нужно запустить три сопрограммы, он будет автоматически обрабатывать выделение, а затем, пока мы не вызовемloop.run_until_complete(tasks)
, программа сразу войдет в состояние выполнения и одновременно запустит три ожидания, чтобы можно было достичь асинхронного расчета.
Этот пример очень простой, мы можем посмотреть пример диаграммы:
Мы видим, что при использовании сопрограммы нужно только найти максимальное время расчета как общее время работы программы, а без использования сопрограммы это суммирование, поэтому 3 секунды при использовании сопрограммы, 6 секунд, когда она не используется.
Тем не менее, следует отметить, что сопрограммы не могут повысить эффективность вычислений процессора.Будь то интенсивный ввод-вывод или интенсивный процессор, сущность сопрограмм не может быть улучшена, а только улучшает использование времени ожидания программы, и по сравнению с потоками гораздо быстрее переключаться напрямую между сопрограммами, в противном случае лучше использовать потоки напрямую.Эффективность переключения потоков в Python очень низкая, поэтому возникает потребность в чем-то вроде сопрограмм для замены некоторых сценариев использования.