Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

271
Vistas
Salir de Python asíncrono para

Tengo una situación en la que quiero salir de un bucle for asíncrono. Logré reducir el problema a la aplicación a continuación. Espero ingresar a la sección 'finalmente' del administrador de contexto al salir del bucle en main. En otras palabras, el resultado esperado es

tratar

456

por fin

hecho

pero lo que obtengo es

tratar

456

hecho

por fin

y luego una excepción cuando se cierra la aplicación.

Aquí está el código

 import asyncio from contextlib import asynccontextmanager @asynccontextmanager async def receiving(): try: print('try') yield 123 finally: print('finally') async def request_all(): async with receiving(): yield 456 async def main(): async for r in request_all(): print(r) break print('done') asyncio.run(main())

Encontré este informe de error que parece similar, pero que yo sepa, se resolvió antes de la versión 3.8. Probé mi problema en 3.8.2 y 3.9.6

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Puedo ver cómo este comportamiento es confuso, pero no creo que sea un error. Si omite el agotamiento del iterador asíncrono con break , nunca deja el async with en request_all , por lo que el bloque finally no se ejecutará hasta que finalice el bucle de eventos. Esto tiene la ventaja de que podría agotar el generador en un momento posterior.

Si está seguro de que ya no necesita su generador, puede cerrar async_generator en lugar de break para obtener el comportamiento esperado:

 import asyncio from contextlib import asynccontextmanager @asynccontextmanager async def receiving(): try: print('try') yield 123 finally: print('finally') async def request_all(): async with receiving(): yield 456 async def main(): gen = request_all() async for r in gen: print(r) await gen.aclose() #instead of break print('done') asyncio.run(main())
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda