Асинхронное программирование на Python

Mar 06 2023
Асинхронное программирование — это парадигма программирования, которая позволяет многим процессам выполняться одновременно и независимо, не дожидаясь завершения одного перед переходом к следующему. В этом посте мы рассмотрим, что такое асинхронное программирование и как его использовать в python.
Асинхронное программирование на Python

Асинхронное программирование — это парадигма программирования, которая позволяет многим процессам выполняться одновременно и независимо, не дожидаясь завершения одного перед переходом к следующему. В этом посте мы рассмотрим, что такое асинхронное программирование и как его использовать в python.

Что такое асинхронное программирование?

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

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

В зависимости от используемого языка программирования и инфраструктуры асинхронное программирование может выполняться с использованием различных стратегий, таких как обратные вызовы, промисы или ключевые слова async/await.

Различия между асинхронным программированием и многопроцессорной обработкой

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

Различия между асинхронным программированием и многопоточностью

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

Для получения дополнительной информации о различиях: Treading, Multiprocessing и асинхронное программирование.

Как использовать Асинцио?

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

import time
import asyncio

def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    for job in todo:
        do_job(job)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

main()

# OUTPUT
# Job A started
# Job Adone
# Job B started
# Job B done
# Job C started
# Job C done
# Took: 3.009 seconds

Создание и запуск сопрограмм

Сопрограмма — это тип функции, которая может быть прервана и возобновлена ​​в разное время во время выполнения. Другими словами, сопрограмма позволяет вам писать код, который можно прервать, сделать что-то еще, а затем возобновить с того места, где он остановился.

Для создания сопрограмм нам нужно использовать asyncключевое слово перед defключевым словом. Вызов сопрограммы не вызывает функцию, которую мы хотим запустить. Он создает задачу.

import time
import asyncio

async def do_job(s):
  ...

async def main():
  ...

main()

asyncio.run(main())

если вы запустите этот код, вы, вероятно, получите примерно такую ​​ошибку:

RuntimeWarning: coroutine '...' was never awaited

import time
import asyncio

async def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

async def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    for job in todo:
        await do_job(job)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

asyncio.run(main())

# OUTPUT
# Job A started
# Job A done
# Job B started
# Job B done
# Job C started
# Job C done
# Took: 3.009 seconds

await asyncio.sleep(1)

tasks = [asyncio.create_task(do_job(item)) for item in todo]
done, pending = await asyncio.wait(tasks)

import time
import asyncio

async def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

async def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    
    tasks = [asyncio.create_task(do_job(item)) for item in todo]
    done, pending = await asyncio.wait(tasks)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

asyncio.run(main())

# OUTPUT
# Job A started
# Job B started
# Job C started
# Job A done
# Job B done
# Job C done
# Took: 1.009 seconds

Вы можете посмотреть видео, чтобы получить больше информации об асинхронном программировании в Python. ( Введение в асинхронный Python | Написание веб-краулера )