Учебное пособие по python: использование сопрограмм async и await Concurrent для программирования

Python

Python оптимизировал параллельное программирование.Более знакомые из них — это использование многопоточности модуля потока и многопроцессорной обработки, а затем медленно вводилась сопрограмма на основе ключевого слова yield. В последних версиях python значительно оптимизирован способ написания сопрограмм, и многие предыдущие способы написания сопрограмм официально не рекомендуются. Если вы знали о сопрограммах Python раньше, вам следует взглянуть на последнее использование.

Параллелизм, Параллелизм, Синхронный и Асинхронный

параллелизм означаетОдин процессор обрабатывает несколько программ одновременно, но одновременно будет обрабатываться только один из них. Ядром параллелизма является: переключение программ.

Однако, поскольку скорость переключения программ очень высока, многие переключения программ могут быть выполнены в течение 1 секунды, что невозможно увидеть невооруженным глазом.

bingfa.jpg

параллельные средстваНесколько процессоров обрабатывают несколько программ одновременно, вы можете обрабатывать несколько одновременно.

并行.jpg

Синхронизация: при выполнении операции ввода-вывода вы должны дождаться завершения выполнения, прежде чем получить возвращаемый результат. Асинхронный: при выполнении операции ввода-вывода результат может быть возвращен, не дожидаясь выполнения.

yibu.jpg

Разница между сопрограммой, потоком и процессом

Многопроцессор обычно использует многоядерные процессоры для выполнения нескольких вычислительных задач одновременно. Каждый процесс имеет свое собственное независимое управление памятью, так что это неприятно, чтобы сообщить данные между различными процессами.

Многопоточность заключается в создании нескольких подзадач на процессоре, и когда подзадача отдыхает, выполняются другие задачи. Управление многопоточностью контролируется самим python. Память распределяется между дочерними потоками и не требует дополнительных механизмов передачи данных. Однако в потоке есть проблема с синхронизацией данных, поэтому должен быть механизм блокировки.

Реализация сопрограммы реализована в потоке, что эквивалентно конвейерному заданию. Поскольку потребление переключения потоков относительно велико, сопрограммы могут предпочтительно использоваться для параллельного программирования.

. . . Вот сравнительная таблица:

Основное использование сопрограмм

Это основное использование сопрограммы в python 3.7.Теперь это использование в основном стабильно, и не рекомендуется использовать предыдущий синтаксис.

import asyncio
import time

async def visit_url(url, response_time):
    """访问 url"""
    await asyncio.sleep(response_time)
    return f"访问{url}, 已得到返回结果"

start_time = time.perf_counter()
task = visit_url('http://wangzhen.com', 2)
asyncio.run(task)
print(f"消耗时间:{time.perf_counter() - start_time}")
  • 1, добавьте ключевое слово async перед обычной функцией;
  • 2, ждут означает ждать завершения выполнения подфунгирования в этом месте, а затем выполнить его. (При одновременной работе преподайте контроль программы к основной программе и позвольте ему назначить другие COROUTINES для выполнения.) Ждут может быть запущена только в функциях с ключевым словом Async.
  • 3, asynco.run() для запуска программы
  • 4. Эта процедура занимает около 2 секунд.

добавить сопрограмму

Добавьте еще одно задание:

task2 = visit_url('http://another.com', 3)
asynicio.run(task2)

Эти две программы занимают в общей сложности около 5 секунд. Он не использует преимущества параллельного программирования. Полный код:

import asyncio
import time

async def visit_url(url, response_time):
    """访问 url"""
    await asyncio.sleep(response_time)
    return f"访问{url}, 已得到返回结果"

async def run_task():
    """收集子任务"""
    task = visit_url('http://wangzhen.com', 2)
    task_2 = visit_url('http://another', 3)
    await asyncio.run(task)
    await asyncio.run(task_2)

asyncio.run(run_task())
print(f"消耗时间:{time.perf_counter() - start_time}")

Если это параллельное программирование, эта программа должна потреблять всего 3 секунды, что является временем ожидания задачи2. Чтобы использовать форму параллельного программирования, приведенный выше код необходимо изменить. asyncio.gather создаст 2 подзадачи, и когда произойдет ожидание, программа будет планировать между этими 2 подзадачами.

async def run_task():
    """收集子任务"""
    task = visit_url('http://wangzhen.com', 2)
    task_2 = visit_url('http://another', 3)
    await asynicio.gather(task1, task2)

create_task

В дополнение к методу сбора, создание дополнительных задач также можно создать с помощью Asyncio.create_Task.

async def run_task():
    coro = visit_url('http://wangzhen.com', 2)
    coro_2 = visit_url('http://another.com', 3)

    task1 = asyncio.create_task(coro)
    task2 = asyncio.create_task(coro_2)

    await task1
    await task2

Основные сценарии использования сопрограмм

Основные сценарии применения сопрограмм — это задачи с интенсивным вводом-выводом.Обобщим несколько распространенных сценариев использования:

  • Сетевые запросы, такие как сканеры, интенсивно используют aiohttp
  • чтение файла, aiofile
  • веб-фреймворк, aiohttp, fastapi
  • запрос к базе данных, asyncpg, базы данных

Направление дальнейшего изучения (следующая статья)

  • Когда использовать сопрограммы, когда использовать многопоточность и когда использовать многопроцессорность
  • БУДУЩИЙ объект
  • низкоуровневый API для asyncio
  • loop
  • использование сторонней библиотеки trio

использованная литература