Compartir tecnología

¿Qué son las corrutinas en Python y cómo implementar la programación asincrónica en Python?

2024-07-12

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

corrutina

Una corrutina es un componente de programa que permite que múltiples puntos de entrada a un programa suspendan y reanuden la ejecución en ubicaciones específicas. A diferencia de los subprocesos y procesos, el cambio de rutina está controlado explícitamente por el programador en lugar de ser programado por el sistema operativo. Esto hace que la rutina sea más liviana al realizar cambios de contexto, ya que no es necesario guardar y restaurar todo el entorno de ejecución (como la pila de subprocesos).

En Python, las corrutinas pasan principalmenteasyncyawait Palabras clave a lograr. Las funciones definidas utilizando estas palabras clave se denominan "funciones de rutina" y no se ejecutan inmediatamente cuando se llaman, sino que devuelven un objeto de rutina. Este objeto de rutina debe programarse para su ejecución en el bucle de eventos.

Programación asincrónica

La programación asincrónica es un modelo de concurrencia que permite que un programa continúe realizando otras tareas mientras espera que se completen ciertas operaciones de larga duración (como operaciones de E/S). En Python, la programación asincrónica se utiliza a menudo con corrutinas, cuya ejecución se programa a través de un bucle de eventos.

Cómo implementar programación asincrónica en Python

1. usoasyncyawait
  • Definir la función de rutina:usarasync defpara definir la función de rutina.
  • Esperar a la corrutina: Dentro de la función de rutina, puedes usarawaitesperar a que se complete otra corrutina u operación asincrónica.
2. Utilice el bucle de eventos
  • Pitónasyncio La biblioteca proporciona una implementación del bucle de eventos. Debe asegurarse de que su código asincrónico se ejecute en algún bucle de eventos.
  • usarasyncio.run(main())para ejecutar su función de rutina principal, que crea y administra automáticamente el bucle de eventos.
3. Código de muestra
 

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())

En este ejemplo,fetch_dataEs una función asincrónica que simula solicitudes de red.mainEn la función iniciamos dos al mismo tiempo.fetch_datauna tarea asincrónica y su usoawait asyncio.gather()Espera a que terminen al mismo tiempo.

4. Precauciones
  • La programación asincrónica y las corrutinas facilitan el manejo de la concurrencia, pero también introducen nuevas complejidades como la gestión de contexto asincrónica, el manejo de errores, etc.
  • Al diseñar código asincrónico, preste especial atención a qué operaciones están bloqueando (por ejemplo, operaciones de E/S sincrónicas) y utilice versiones asincrónicas de bibliotecas y API siempre que sea posible.
  • asyncio Es parte de la biblioteca estándar de Python y se utiliza para admitir corrutinas y programación asincrónica.También proporciona API rica comoasyncio.Queueasyncio.Locketc., para manejar problemas de concurrencia y sincronización en código asincrónico.