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

272
Vistas
¿El generador asíncrono no es un iterador?

En Python puedes escribir un generador que sea iterable como:

 def generate(count): for x in range(count): yield x # as an iterator you can apply the function next() to get the values. it = generate(10) r0 = next(it) r1 = next(it) ...

Cuando intenta usar un iterador asíncrono, obtiene el error 'rendimiento dentro de asíncrono'. La solución sugerida es implementar su propio generador:

 class async_generator: def __aiter__(self): return self async def __anext__(self): await asyncio.sleep() return random.randint(0, 10) # But when you try to get the next element it = async_generator(10) r0 = next(it)

Obtiene el error "async_generator" object is not an iterator

Creo que si va a llamar a algo un iterador es porque tiene exactamente la misma interfaz, por lo que puedo escribir iteradores asíncronos y usarlos en un marco que depende en gran medida de las llamadas next(). Cualquier nueva capacidad de Python no tiene sentido si necesita reescribir todo su código para poder usar async.

¿Me estoy perdiendo de algo?

¡Gracias!

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

0

Entonces, como dijo @bosnjak, puede usar async para:

 async for ITEM in A_ITER: BLOCK1 else: # optional BLOCK2

Pero si desea iterar manualmente, simplemente puede escribir:

 it = async_iterator() await it.__anext__()

Pero no recomendaría hacer eso.

Creo que si va a llamar a algo iterador es porque tiene exactamente la misma interfaz, por lo que puedo escribir iteradores asíncronos y usarlos en un marco que depende en gran medida de las llamadas next()

No, en realidad no es lo mismo. Hay una diferencia entre los iteradores síncronos regulares y los asíncronos. Y hay algunas razones para eso:

  1. Las corrutinas de Python se construyen sobre generadores internamente
  2. Según Zen of Python, lo explícito es mejor que lo implícito. Para que realmente vea dónde se puede suspender el código.

Es por eso que es imposible usar iter y next con iteradores asincrónicos. Y no puede usarlos con marcos que esperan iteradores sincrónicos. Entonces, si va a hacer que su código sea asíncrono, también debe usar marcos asíncronos. Aquí hay algunos de ellos.

Además, me gustaría decir algunas palabras sobre iteradores y generadores. Iterator es un objeto especial que tiene los métodos __iter__ y __next__ . Mientras que el generador es una función especial que contiene la expresión yield . Todo generador es un iterador, pero no al revés . Lo mismo es aceptable para iteradores y generadores asincrónicos. ¡Sí, desde Python 3.6 puede escribir generadores asíncronos!

 async def ticker(delay, to): for i in range(to): yield i await asyncio.sleep(delay)

Puede leer PEP 525 para más detalles

over 4 years ago · Santiago Trujillo Denunciar

0

Creo que se introdujo una nueva declaración para los generadores asíncronos:

 async for TARGET in ITER: BLOCK else: BLOCK2

según PEP 492 .

Básicamente, esto significaría que deberías hacer:

 async for number in generate(10): print(number)

Además, verifique las diferencias de los generadores :

Los objetos de rutina nativos no implementan los métodos iter y next . Por lo tanto, no se pueden iterar ni pasar a iter() , list() , tuple() y otras funciones integradas. Tampoco se pueden usar en un bucle for..in. Un intento de usar iter o next en un objeto de rutina nativo dará como resultado un TypeError .

over 4 years ago · Santiago Trujillo Denunciar

0

Usé esto para hacer un bucle asíncrono a través de una lista

 class AsyncRange(object): def __init__(self, length): self.length = length self.i = 0 async def __aiter__(self): return self async def __anext__(self): index = self.i self.i += 1 if self.i <= self.length: return index else: raise StopAsyncIteration

entonces simplemente:

 async for i in AsyncRange(my_list): # your code
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