Обмен технологиями

Что такое сопрограммы в Python и как реализовать асинхронное программирование в Python

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Сопрограмма

Сопрограмма — это программный компонент, который позволяет нескольким точкам входа в программу приостанавливать и возобновлять выполнение в определенных местах. В отличие от потоков и процессов, переключение сопрограмм явно контролируется программистом, а не запланировано операционной системой. Это делает сопрограмму более легкой при выполнении переключения контекста, поскольку нет необходимости сохранять и восстанавливать всю среду выполнения (например, стек потоков).

В Python сопрограммы в основном проходятasyncиawait Ключевые слова для достижения. Функции, определенные с использованием этих ключевых слов, называются «функциями сопрограммы», и они не выполняются сразу при вызове, а вместо этого возвращают объект сопрограммы. Этот объект сопрограммы необходимо запланировать для выполнения в цикле событий.

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

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

Как реализовать асинхронное программирование на Python

1. Используйтеasyncиawait
  • Определить функцию сопрограммы:использоватьasync defопределить функцию сопрограммы.
  • Дождитесь сопрограммы: Внутри функции сопрограммы вы можете использоватьawaitдождаться завершения другой сопрограммы или асинхронной операции.
2. Используйте цикл событий
  • Питонasyncio Библиотека обеспечивает реализацию цикла событий. Вам необходимо убедиться, что ваш асинхронный код выполняется в каком-то цикле событий.
  • использоватьasyncio.run(main())для запуска вашей основной функции сопрограммы, которая автоматически создает цикл событий и управляет им.
3. Пример кода
 

python复制代码

import asyncio
# 定义一个异步函数,模拟一个耗时的I/O操作
async def fetch_data(url):
print(f"Fetching {url}...")
# 模拟耗时操作
await asyncio.sleep(1)
return f"Data from {url}"
async def main():
# 同时启动多个异步任务
task1 = asyncio.create_task(fetch_data('http://example.com/data1'))
task2 = asyncio.create_task(fetch_data('http://example.com/data2'))
# 等待所有任务完成
result1, result2 = await asyncio.gather(task1, task2)
print(result1)
print(result2)
# 运行主协程
asyncio.run(main())

В этом примереfetch_dataЭто асинхронная функция, имитирующая сетевые запросы.mainВ функции мы запустили два одновременноfetch_dataасинхронная задача и использованиеawait asyncio.gather()Подождите, пока они закончатся одновременно.

4. Меры предосторожности
  • Асинхронное программирование и сопрограммы упрощают работу с параллелизмом, но также вносят новые сложности, такие как асинхронное управление контекстом, обработка ошибок и т. д.
  • При разработке асинхронного кода обратите особое внимание на то, какие операции блокируются (например, синхронные операции ввода-вывода), и по возможности используйте асинхронные версии библиотек и API.
  • asyncio Он является частью стандартной библиотеки Python и используется для поддержки сопрограмм и асинхронного программирования.Он также предоставляет богатый API, такой какasyncio.Queueasyncio.Lockи т. д. для решения проблем параллелизма и синхронизации в асинхронном коде.